Advertisement
Guest User

table 69x6

a guest
Mar 11th, 2013
142
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 10.07 KB | None | 0 0
  1. import java.util.*;
  2. import java.io.*;
  3.  
  4.  
  5. public class testingsolution2 {
  6.     public static int nVolte;
  7.     public static int X = 69;
  8.     public static int Y = 6;
  9.     public static int RIP = 9;
  10.     public static int MAX = 46;
  11.     public static int[][] sudoku = new int[Y][X];
  12.     public static int[][] controlli = new int[MAX+1][MAX+1];
  13.     public static int[][] appoggioscambio = new int[X][2];
  14.     public static int[] vett = new int[Y*X];
  15.     public static Scanner sc = new Scanner(System.in);
  16.     public static int imax = 370;
  17.     public static int imin = 377;
  18.  
  19.  
  20.    
  21.     public static void main (String args[]) {
  22.         Random rgen = new Random();  // Random number generator
  23.        
  24.         boolean messo, presente, possibile;
  25.         int n,c2;
  26.         long ciclo=0;
  27.         c2=0;
  28.  
  29.        
  30.         //riempio
  31.         for (int i=0; i<MAX; i++) {
  32.             for (int j=0; j<RIP; j++){
  33.             vett[c2] = (i+1);
  34.             c2++;
  35.             }
  36.         }
  37.        
  38.         //--- Shuffle by exchanging each element randomly
  39.         for (int i=0; i<vett.length; i++) {
  40.             int randomPosition = rgen.nextInt(vett.length);
  41.             int temp = vett[i];
  42.             vett[i] = vett[randomPosition];
  43.             vett[randomPosition] = temp;
  44.         }
  45.        
  46.         //inizializzo sudoku con tutti i valori a -1
  47.         for (int i=0; i<X; i++) {
  48.             for (int j=0; j<Y; j++) {
  49.                 sudoku[j][i] = -1;
  50.             }
  51.         }
  52.        
  53.         //inizializzo controlli, 0 = da mettere, 1 = da non mettere
  54.         for (int i=1; i<MAX; i++) {
  55.             for (int j=1; j<MAX; j++) {
  56.                 if(i==j) controlli[j][i] = 1;
  57.                 else controlli[j][i] = 0;
  58.             }
  59.         }
  60.         System.out.println("Finito inizializzazione");
  61.        
  62.         //inserimento
  63.         for (int i=0; i<(Y*X); i++){
  64.             if(i>imax){
  65.                 stampa("tabella_imax" + i, i);
  66.                 imax = i;
  67.             }
  68.             System.out.println("Progresso: " + i + " su: " + ((Y*X)-1) + " ciclo: " + ciclo);
  69.             ciclo++;
  70.             //controllo(i);
  71.             presente = true;
  72.             messo = false;
  73.             n=0;//orizzonatale
  74.            
  75.            
  76.            
  77.             //controllo se gia presente in colonna
  78.            
  79.             while(messo == false){
  80.                 //System.out.println("inizio while n=" +n);
  81.                 //controllo se c'e' uno spazio
  82.                 possibile = controllospazio(n);
  83.                 if(possibile == false) n++;
  84.                 else{
  85.                     //System.out.println("possibile");
  86.                     //controllo se posso mettere vett[i] assieme a tutti gli altri valori nella colonna n
  87.                     presente = controllovalore(n, vett[i]); // ritorna vero se il valore e' gia combaciato con altri valori, falose se no (indi posso metterlo in quella colonna)
  88.        
  89.                     //inserisco un numero vett[i] (m) nella tabella alla colonna n e cambio i controlli
  90.                     if(presente == false){
  91.                         messo = inseriscovalore(n, vett[i]); // ritorna vero se inserito falso se non inserito
  92.                     }
  93.                
  94.                     //non presente, no posti liberi
  95.                     if(messo == false) n++;
  96.                 }//end else possibile
  97.                
  98.                 //se raggiungo ultima colonna inizio a scambiare
  99.                 if(n==X){
  100.                     //prima di iniziare lo scambio controllo se ci sono altri numeri da isnerite
  101.                     for(int i1 = (i+1); i1<(X*Y); i1++){
  102.                         for(int n1 = 0; n1<X; n1++){ // per ogni colonna
  103.                             if(controllospazio(n1)){ //ritorna vero se c'e' uno spazio vuoto in quella colonna
  104.                                 if(!controllovalore(n1, vett[i1])){ //ritorna falso se non combacia
  105.                                     inseriscovalore(n1, vett[i1]); // inserisce
  106.                                     //riordina array (sposta avanti da i a i1 tutti i valori, poi scala i di 1
  107.                                     for(int j = i1; j>i; j--){
  108.                                         vett[j]=vett[j-1];
  109.                                     }
  110.                                     i++;
  111.                                 }
  112.                             }
  113.                         }
  114.                     }
  115.                     //se ho piu di 380 numeri insiriti inizia a testare tutte le colonne
  116.                     //scambia
  117. //                  System.out.println("scambio " + vett[i]);
  118.                     i = scambio(vett[i], i);
  119.                    
  120.                     break;
  121.                 }
  122.             }   //end while presente
  123.            
  124.         }   //end for inserimento
  125.         System.out.println("end for inserimento");
  126.         stampa("tabella_finita", 413);
  127.     }//end esegui
  128.    
  129.    
  130.     //output to file
  131.     public static void stampa(String nome, int pos){   
  132.         try{
  133.            
  134.             new File("N:/Tabelle").mkdirs();
  135.               // Create file
  136.                 PrintWriter out = new PrintWriter(new FileWriter("N:\\Tabelle\\" + nome +".txt"));
  137.               for(int c=0;c<Y;c++){
  138.                   for(int d=0; d<X;d++){
  139.                   out.print(sudoku[c][d] + "\t");
  140.                   }
  141.                   out.println("");
  142.               }
  143.               out.println("num non ancora inseriti");
  144.               for(int i=pos; i<(X*Y); i++){
  145.                   out.print(vett[i] + "\t");
  146.               }
  147.               out.println();
  148.               out.println("\n Tabella match");
  149.               for(int i = 0; i<=MAX; i++){
  150.                   for(int j = 0; j<=MAX; j++){
  151.                       if(i==0) out.print(j + "\t");
  152.                       else if(j==0) out.print(i + "\t");
  153.                       else out.print(controlli[i][j] + "\t");
  154.                   }
  155.                   out.println();
  156.               }
  157.               //Close the output stream
  158.               out.close();
  159.               }catch (Exception e){//Catch exception if any
  160.               System.err.println("Error: " + e.getMessage());
  161.               }
  162.        
  163.     }   //end stampa
  164.    
  165.    
  166.     //controllospazio
  167.     public static boolean controllospazio(int n){
  168.        
  169.         boolean possibile = false;
  170.         for(int i = 0; i<Y; i++){
  171.             if(sudoku[i][n]==-1) possibile = true;
  172.         }
  173.         return possibile;
  174.     }
  175.    
  176.    
  177.     //controllo se posso mettere vett[i] (m) assieme a tutti gli altri valori nella colonna n
  178.     public static boolean controllovalore(int n, int m){
  179.    
  180.         boolean presente = false;
  181.         for(int i = 0; i<Y; i++){
  182.             if(sudoku[i][n]==-1) presente = false;
  183.             else if(controlli[sudoku[i][n]][m]==1) {
  184.                 presente = true;
  185.                 break;
  186.             }
  187.         }
  188.         return presente;
  189.     }
  190.    
  191.    
  192.     //inserisco un numero vett[i] (m) nella tabella alla colonna n e cambio i controlli
  193.     public static boolean inseriscovalore(int n, int m){
  194. //      System.out.println("inserisco= " + m);
  195.         boolean inserito = false;
  196.         for(int i = 0; i<Y; i++){
  197.             if(sudoku[i][n]==-1){
  198.                 sudoku[i][n]=m;
  199.                 inserito = true;
  200.                 //modifico i controlli
  201.                 for(int j = 0; j<Y; j++){
  202.                     if(sudoku[j][n]!=-1) {
  203.                         controlli[sudoku[j][n]][m]=1;
  204.                         controlli[m][sudoku[j][n]]=1;
  205.                     }
  206.                 }
  207.                 break;
  208.             }
  209.         }
  210.         return inserito;
  211.     }
  212.    
  213.  
  214.    
  215.     //scambio, controllo una alla volta tutte le colonne alla ricerca di un buon posto per inserire il valore
  216.     //salvo il numero di match per ogni colonna e scelgo a random tra le piu corte
  217.     //tolgo tutti i valori che fanno match e inserisco il valore iniziale senza posto, aggiorno i e inserisco i valori nel vettore
  218.     //ritorna la nuova posizione di i
  219.         //problema: continua a scambiare gli stessi 2 numeri. possibile soluzione:
  220.             //rendere una colonna "non scambiabile" per tot cicli
  221.             //
  222.     public static int scambio(int m, int pos){
  223. //      System.out.println("inizio scambio. i= " + pos + " m: " + m);
  224.        
  225.         //inizzializza il valore di appoggio
  226.         for(int i = 0; i<X; i++){
  227.             appoggioscambio[i][0]=100;
  228.             appoggioscambio[i][1]=i;
  229.         }
  230.         //inizio i controlli
  231.         for(int i = 0; i<X; i++){
  232.             //controllo ogni colonna
  233.             for(int j = 0; j<Y; j++){
  234.                 //controllo ogni riga
  235.                 if(sudoku[j][i]!=-1){
  236.                     if(controlli[sudoku[j][i]][m]==1 && sudoku[j][i] != m){
  237.                         if(appoggioscambio[i][0] == 100) appoggioscambio[i][0] = 0;
  238.                         appoggioscambio[i][0]++;
  239.                     }
  240.                     if(sudoku[j][i] == m){
  241.                         appoggioscambio[i][0]=appoggioscambio[i][0]+7;
  242. //                      System.out.print("trovato se stesso in col " + i + " ");
  243.                     }
  244.                 }
  245.             }
  246.            
  247.         }//fine controlli tabella, appoggioscambio ha dentro tutti i numeri di match
  248.         //ordina i match
  249.        
  250.         appoggioscambio = Sort(appoggioscambio);
  251.        
  252.         //trovo quante colonne hanno il num minore di match
  253.         int contatore = 0;
  254.         for(int i = 0; i<X; i++){
  255.             if(appoggioscambio[i][0]==appoggioscambio[0][0]) contatore++;
  256.             else break;
  257.         }
  258.        
  259.         //sceglio a caso una di quelle colonne
  260.         Random rgen = new Random();
  261.         int rndCol = rgen.nextInt(contatore);
  262.         boolean trovato = false;
  263.         int rimossi = 0;
  264.         int colx = 0;
  265.         while(!trovato){
  266.         //rimuovo match dalla colonna
  267.         rndCol = rgen.nextInt(contatore);
  268.         rimossi = 0;
  269.         colx = appoggioscambio[rndCol][1];
  270.         if(appoggioscambio[rndCol][0]<7 && appoggioscambio[rndCol][0]>0){
  271. //          System.out.print(" - scelto colonna: " + colx);
  272.             for(int j=0; j<Y;j++){
  273.                 if(sudoku[j][colx]!=-1){
  274.                     if(controlli[sudoku[j][colx]][m]==1 && sudoku[j][colx]!=m){
  275.                         //riinserisco il num che sto x rimuovere nel vettore dei num da inserire
  276.                         //in coda
  277.                        
  278.                         for(int k = pos-10; k<((X*Y)-1); k++){
  279.                             vett[k] = vett[k+1];
  280.                         }
  281.                         vett[(X*Y)-1]=sudoku[j][colx];
  282.                        
  283. //                      System.out.println("- rimuovo: " + sudoku[j][colx]);
  284.                         //sistemo i controlli
  285.                         for(int i = 0; i<Y; i++){
  286.                             if(sudoku[i][colx]!=-1 && sudoku[j][colx]!=-1 && sudoku[i][colx]!=sudoku[j][colx]) {
  287.                                 controlli[sudoku[j][colx]][sudoku[i][colx]]=0;
  288.                                 controlli[sudoku[i][colx]][sudoku[j][colx]]=0;
  289.                             }
  290.                         }
  291.                         //rimuovo il numero
  292.                         sudoku[j][colx]=-1;
  293.                         rimossi++;
  294.                     }
  295.                 }
  296.             }
  297.         trovato = true;
  298.         }
  299.         }
  300.         //inserisco valore nella colonna
  301.         inseriscovalore(colx, m);
  302. //      System.out.println("fine scambio. appoggioscambio= " + appoggioscambio[rndCol][0] + "/" + rimossi );
  303.         return (pos - rimossi);
  304.     }
  305.    
  306.     //sort
  307.     public static int[][] Sort(int[][] data){
  308.         for(int i = 0; i < X; i++) {
  309.             boolean flag = false;
  310.             for(int j = 0; j < X-1; j++) {
  311.                 //Se l' elemento j e maggiore del successivo allora
  312.                 //scambiamo i valori
  313.                 if(data[j][0]>data[j+1][0]) {
  314.                     int k = data[j][0];
  315.                     int k2 = data[j][1];
  316.                     data[j][0] = data[j+1][0];
  317.                     data[j][1] = data[j+1][1];
  318.                     data[j+1][0] = k;
  319.                     data[j+1][1] = k2;
  320.                     flag=true; //Lo setto a true per indicare che é avvenuto uno scambio
  321.                 }
  322.                
  323.  
  324.             }
  325.  
  326.             if(!flag) break; //Se flag=false allora vuol dire che nell' ultima iterazione
  327.                              //non ci sono stati scambi, quindi il metodo può terminare
  328.                              //poiché l' array risulta ordinato
  329.             }
  330.        
  331.           return data;
  332.         }
  333.    
  334.     //controllo di -1
  335.     public static void controllo(int pos){
  336.         int c =0;
  337.         for(int i = 0; i<X; i++){
  338.             for(int j = 0; j<Y; j++){
  339.                 if(sudoku[j][i]==-1) c++;
  340.             }
  341.         }
  342.         if(c!=(414 - pos)){
  343.             System.out.println("\nerrore numero di -1: " + c + " num do numeri da inserire: " + (414 - pos));
  344.             sc.nextLine();
  345.         }
  346.     }
  347.    
  348.    
  349. }   //end class
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement