Advertisement
chaunhatlong

Sudoku nxn

May 29th, 2015
643
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.35 KB | None | 0 0
  1. #include <stdio.h>
  2. const int Nmax=630;
  3. int a[Nmax];
  4. int n;
  5. int lastK;
  6.  
  7. int Nhap();
  8. int Xuat();
  9. int xuatfile();
  10. int Try(int i);
  11. int isOK(int i, int x);
  12. int findLastK();
  13.  
  14. int main()
  15. {
  16.     printf("Nhap so lieu de bai...\n");
  17.     Nhap();
  18.     lastK = findLastK();
  19.     printf("De bai:\n");
  20.     Xuat();
  21.     //xuatfile();
  22.     printf("\nBam enter de bat dau giai...\n");
  23.     getchar();
  24.     Try(0);
  25.     getchar();
  26.     return 0;
  27. }
  28.  
  29. int Nhap()
  30. {
  31.     int i, tmp;
  32.     FILE *fp = NULL;
  33.     fp = fopen("input.txt", "r");
  34.     fscanf(fp,"%d",&n);
  35.     for (i=0; i<n*n*n*n; i++)
  36.     {
  37.             fscanf(fp, "%d", &tmp);
  38.             a[i]= tmp;
  39.     }
  40.     fclose(fp);
  41.     return 0;
  42. }
  43.  
  44. int Xuat()
  45. {
  46.     int i;
  47.     for (i=0; i<n*n*n*n; i++)
  48.     {
  49.         if ( i%(n*n) ==0) printf("\n");
  50.         printf(" %d", a[i]);
  51.     }
  52.         printf("\n------------------");
  53.     return 0;
  54. }
  55.  
  56. int xuatfile()
  57. {
  58.     int i;
  59.     FILE *fp;
  60.     fp=fopen("output.txt","w");
  61.     for (i=0; i<n*n*n*n; i++)
  62.     {
  63.         if ( i == n*n*n*n) printf("\n----------------------");
  64.             if(i%(n*n)==0)
  65.                 {  
  66.                     printf("\n");
  67.                     fprintf(fp,"\n");
  68.                     }
  69.                 printf(" %d", a[i]);
  70.                 fprintf(fp,"%d ", a[i]);
  71.        
  72.        
  73.     }
  74.     fclose(fp);
  75. }
  76.  
  77. int Try(int i)
  78. {
  79.     int x;
  80.     while (a[i]!=0)
  81.         i++;
  82.     for (x=1; x<=n*n; x++)
  83.         if (isOK(i, x))
  84.         {
  85.             a[i] = x;
  86.             if (i==lastK){
  87.                 xuatfile();
  88.                 printf("\n");
  89.                 }
  90.             else
  91.                 Try(i+1);
  92.             a[i] = 0;
  93.         }
  94.     return 0;
  95. }
  96.  
  97. int isOK(int i, int x)
  98. {
  99.     int k, t, t1, t2;
  100.     int kth, ktc, kto;
  101.     int tmpX, tmpY;
  102.     //kiem tra hang thu i da co cai nao trung chua
  103.     t1= i%(n*n);
  104.     t2= i/(n*n);
  105.     for (k=(t2*n*n); k<(t2*n*n+n*n); k++)
  106.         if (a[k] == x)
  107.             return 0;
  108.     //kiem tra cot thu j da co cai nao trung chua
  109.     for (k=0; k<n*n; k++)
  110.         if (a[k*n*n+t1] == x)
  111.             return 0;
  112.  
  113.     //kiem tra trong o 3x3
  114.     tmpX = t2%n; tmpY = t1%n;
  115.     for (k=t2-tmpX; k<=t2-tmpX+n-1; k++)
  116.         for (t=t1-tmpY; t<=t1-tmpY+n-1; t++)
  117.             if (a[k*n*n+t] == x)
  118.                 return 0;
  119.     return 1;
  120. }
  121.  
  122. int findLastK()
  123. {
  124.     int i;
  125.     for (i=n*n*n*n-1; i>=0;i--)
  126.             if (a[i]==0)
  127.             {
  128.                 return (i);
  129.             }
  130. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement