Carré magique d'ordre pair

Soyez le premier à donner votre avis sur cette source.

Vue 6 582 fois - Téléchargée 692 fois

Description

Ce code source est réalisé par Netbeans IDE pour calculer le carré magique d'un nombre pair, et il l’affiche dans une zone text area,
Vous trouvez une copie du projet jointe a ce document

Source / Exemple :


package desktopapplication1;

/*

  • To change this template, choose Tools | Templates
  • and open the template in the editor.
  • /
/** *
  • @author a.kacen
  • /
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.text.ParseException; public class carremagiquepaire { static int x; static int xx[][]; static int [][] cImpair(int n) { int c[][]=new int [n][n]; int i,j,k,m,v; i=1; j=n/2-1; for(v=0, m=0; m<n; m++) { for(k=0; k<n; k++) { // -1 en ligne, +1 en colonne i=(i==0)?n-1:i-1; j=(j==n-1)?0:j+1; c[i][j]=++v; } // Avant la collision i+=2; if(i>=n) i=i-n; j=(j==0)?n-1:j-1; } return c; } public static int [][] cPair(int n) { // utilise: // la constante c4 // les méthodes: cPAir, cImpair, complement, isoLiDi, symetrieLigne // if(n<6) { return c4;} // ta, tb, tc, td sontdes carrés d'ordre n/2 // ta ne contient que des 0 et des 3; ta et tc sont complémentaires // tb ne contient que des 1 et des 2; tb et td sont complémentaires // cm est un carré magique d'ordre n/2; cn est symétrique-ligne de cm // Le carré est | ta tb | | ca cm | // (n/2)^2 * | | + | | // | tc td | | cs cs | int nn=n/2, n2=nn*nn; int ta[][], tc[][]; int tb[][], td[][], tt[][]; tb = new int[nn][nn]; tc = new int[nn][nn]; tc = new int[nn][nn]; // m2=nb.de 2 par ligne dans tb; m1= nb.de 1 dans tb // m3=nombre de 3 par ligne dans ta; // à vérifier: 3*m3+m2 = nn // Générer ta et tc int m3=nn/2, d3=nn-m3; ta = isoLiDi(m3,d3,nn,3,0); tc = complement(ta,nn,3); // Générer tb et td int m2=2*nn-3*m3,m1=nn-m2; // dans tb m2=nn-m2;m1=nn-m1; // dans td int d2=nn-m2,d1=nn-d2; td = isoLiDi(m1,d2,nn,1,2); tb = complement(td,nn,3); // Un carré magique,et son "symétrique ligne" int cm[][], cc[][]; if(nn%2==0) cm=cPair(nn); else cm=cImpair(nn); int cs[][] = symetrieLigne(cm,nn); // Carré complet int i,ip,j,jp, c[][] = new int [n][n]; for(tt=ta, cc=cm, ip= 0, jp= 0, i=0; i<nn; i++) for(j=0; j<nn; j++) c[i+ip][j+jp]=tt[i][j]*n2+cc[i][j]; for(tt=tb, cc=cm, ip= 0, jp=nn, i=0; i<nn; i++) for(j=0; j<nn; j++) c[i+ip][j+jp]=tt[i][j]*n2+cc[i][j]; for(tt=tc, cc=cs, ip=nn, jp= 0, i=0; i<nn; i++) for(j=0; j<nn; j++) c[i+ip][j+jp]=tt[i][j]*n2+cc[i][j]; for(tt=td, cc=cs,ip=nn, jp=nn, i=0; i<nn; i++) for(j=0; j<nn; j++) c[i+ip][j+jp]=tt[i][j]*n2+cc[i][j]; return c; } static int[][] isoLiDi( int p, int q, int n, int vp,int va) { // Construction de matrice en 0/1 contenant p fois vp par ligne // et q fois vp sur la diagonale principale // les autres elements contiennent va // Le matrice construite est symétrique par rapport au point n/2,n/2: // t[i][j] == t[n-1-i][n-1-j] // CONDITION: (0<p<n && 0<=q<=n) || (p==0 && q<n) || (p==n && q==n) int t[][] = new int[n][n]; int i,iip1,j,md, ml; // p fois vp et n-p fois va par ligne ou diag.princ // iip1 vaut 0 ou 1 suivant qu'on place vp sur la diagonale ou non // md nombre de vp sur la diagonale; ml nombre de vp par ligne for(i=0, md=0; i<n; i++) { iip1=0; if(md<q) md++; else iip1=1; // p fois vp à partir de [i][i] ou [i][i+1] for(ml=0,j=i+iip1; ml<p; ml++,j++) { if(j>=n) j-=n; t[i][j]=vp; } // va pour les autres positions de la ligne i for( ; ml<n; ml++,j++) { if(j>=n) j-=n; t[i][j]=va; } } return t; } static int[][] complement( int a[][], int n, int vc) { // Construit le complément du carré a // c est rempli de haut en bas d'après les lignes de a, utilisées // de bas en haut // si a[i][j]==v, alors c[n-1-i][j]==vc-v int i,j,ii, c[][] = new int[n][n]; // c est rempli de haut en bas; les lignes de a de bas en haut for(i=0, ii=n-1; i<n; i++, ii--) { // ligne i de c: échange v1 <--> v2 par rapport à ligne ii de a for(j=0; j<n; j++) c[i][j] = vc-a[ii][j]; } return c; } static int[][] symetrieLigne(int a[][], int n) { int i,j, c[][] = new int[n][n]; for(i=0; i<n; i++) { // ligne i de cs = ligne symétrique de cm for(j=0; j<n; j++) c[i][j] = a[n-1-i][j]; } return c; } static int lire () throws ParseException { int n; BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); System.out.print ("Taille du carré magique, svp?:: "); try { n = Integer.parseInt (in.readLine()); } catch (IOException e) { n = 0; } // if ((n <= 0) || (n % 2 != 0)) System.out.println("Taille impossible."); return n; } static void imprimer(int x[][]){ int taille=x.length; System.out.println(taille); for(int ii=0;ii<taille;ii++){ for (int jj=0;jj<taille;jj++){ System.out.print(x[ii][jj]); System.out.print(" "); } System.out.println(); } } /* public static void main(String [] args){ try { x=lire(); } catch (ParseException e) { // TODO Auto-generated catch block e.printStackTrace(); } xx= cPair(x) ; //System.out.println(xx); imprimer(xx); }*/ }

Conclusion :


Pour afficher les résultats il faut utiliser la fenêtre d'affichage qui se trouve dans le projet

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.