Advertisement
Guest User

Untitled

a guest
Jun 15th, 2019
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.26 KB | None | 0 0
  1. #define SSSIZE 4
  2. void setNmbr(int **solu,int poss[SSSIZE][SSSIZE][SSSIZE],int x,int y,int val){
  3.   solu[x][y]=val;
  4.   for(int i=0;i<SSSIZE;i++){
  5.   poss[x][y][i]=0;
  6.   poss[x][i][val-1]=0;
  7.   poss[i][y][val-1]=0;
  8.   }
  9.   printf("%d,%d,%d\n",x,y,val);
  10. }
  11. void check(int **solu,int poss[SSSIZE][SSSIZE][SSSIZE]){
  12.   int found=0;
  13.  
  14.   for(int i=0;i<SSSIZE;i++){
  15.     int nums[SSSIZE];
  16.     for(int i=0;i<SSSIZE;i++){
  17.       nums[i]=0;
  18.     }
  19.     for(int j=0;j<SSSIZE;j++){
  20.       int zeros=0;
  21.       for(int k=0;k<4;k++){
  22.         if(poss[i][j][k]){
  23.           nums[poss[i][j][k]-1]++;
  24.         }else{
  25.           zeros++;
  26.         }
  27.       }
  28.       if(zeros==3){
  29.         for(int k=0;k<SSSIZE;k++){
  30.           if(poss[i][j][k]){
  31.             setNmbr(solu,poss,i,j,poss[i][j][k]);
  32.             found=1;
  33.           }
  34.         }
  35.       }
  36.     }
  37.     for(int m=0;m<SSSIZE;m++){
  38.       if(nums[m]==1){
  39.       for(int j=0;j<SSSIZE;j++){
  40.         if(poss[i][j][m]){
  41.           setNmbr(solu,poss,i,j,m+1);
  42.           found=1;
  43.         }
  44.       }
  45.     }
  46.     }
  47.   }
  48.  if(found){
  49.   check(solu,poss);
  50.  }
  51. }
  52.  
  53. int** SolvePuzzle (int *clues) {
  54.  
  55.  int **solu = (int **)malloc(4 * sizeof(int *));
  56.  int row;
  57.  for (row = 0; row < 4; row++) {
  58.    solu[row] = (int *)malloc(4 * sizeof(int));
  59.  }
  60.  
  61.  for(int i=0;i<4;i++){
  62.    for(int j=0;j<4;j++){
  63.      solu[i][j]=0;
  64.    }
  65.  }
  66.  int poss[4][4][4]={{{1,2,3,4},{1,2,3,4},{1,2,3,4},{1,2,3,4}},
  67.                     {{1,2,3,4},{1,2,3,4},{1,2,3,4},{1,2,3,4}},
  68.                     {{1,2,3,4},{1,2,3,4},{1,2,3,4},{1,2,3,4}},
  69.                     {{1,2,3,4},{1,2,3,4},{1,2,3,4},{1,2,3,4}}};
  70.  
  71.  for(int i=0;i<4;i++){
  72.    switch(clues[i]){
  73.      case 0:  break;
  74.      case 1:  setNmbr(solu,poss,0,i,4);
  75.               break;
  76.      case 2:  poss[0][i][3]=0;
  77.               break;
  78.      case 3:  poss[0][i][3]=0;
  79.               poss[1][i][3]=0;
  80.               break;
  81.      case 4:  setNmbr(solu,poss,0,i,1);
  82.               setNmbr(solu,poss,1,i,2);
  83.               setNmbr(solu,poss,2,i,3);
  84.               setNmbr(solu,poss,3,i,4);
  85.               break;
  86.    }
  87.  }
  88.  for(int i=4;i<8;i++){
  89.    switch(clues[i]){
  90.      case 0:  break;
  91.      case 1:  setNmbr(solu,poss,i%4,3,4);
  92.               break;
  93.      case 2:  poss[i%4][3][3]=0;
  94.               break;
  95.      case 3:  poss[i%4][3][3]=0;
  96.               poss[i%4][2][3]=0;
  97.               break;
  98.      case 4:  setNmbr(solu,poss,i%4,0,4);
  99.               setNmbr(solu,poss,i%4,1,3);
  100.               setNmbr(solu,poss,i%4,2,2);
  101.               setNmbr(solu,poss,i%4,3,1);
  102.               break;
  103.    }
  104.  }
  105.  for(int i=8;i<12;i++){
  106.    switch(clues[i]){
  107.      case 0:  break;
  108.      case 1:  setNmbr(solu,poss,3,3-(i%4),4);
  109.               break;
  110.      case 2:  poss[3][3-(i%4)][3]=0;
  111.               break;
  112.      case 3:  poss[3][3-(i%4)][3]=0;
  113.               poss[2][3-(i%4)][3]=0;
  114.               break;
  115.      case 4:  setNmbr(solu,poss,0,3-(i%4),4);
  116.               setNmbr(solu,poss,1,3-(i%4),3);
  117.               setNmbr(solu,poss,2,3-(i%4),2);
  118.               setNmbr(solu,poss,3,3-(i%4),1);
  119.               break;
  120.    }
  121.  }
  122.  for(int i=12;i<16;i++){
  123.    switch(clues[i]){
  124.      case 0:  break;
  125.      case 1:  setNmbr(solu,poss,3-(i%4),0,4);
  126.               break;
  127.      case 2:  poss[3-(i%4)][0][3]=0;
  128.               break;
  129.      case 3:  poss[3-(i%4)][0][3]=0;
  130.               poss[3-(i%4)][1][3]=0;
  131.               break;
  132.      case 4:  setNmbr(solu,poss,3-(i%4),0,1);
  133.               setNmbr(solu,poss,3-(i%4),1,2);
  134.               setNmbr(solu,poss,3-(i%4),2,3);
  135.               setNmbr(solu,poss,3-(i%4),3,4);
  136.               break;
  137.    }
  138.  }
  139.  
  140.  check(solu,poss);
  141.  
  142.  for(int i=0;i<4;i++){
  143.  
  144.    if(solu[3][i]==4&&clues[i]==2){
  145.      setNmbr(solu,poss,0,i,3);
  146.    }
  147.    if(solu[3][i]==4&&clues[i]==3){
  148.      poss[0][i][2]=0;
  149.      poss[1][i][1]=0;
  150.    }
  151.    
  152.    if(solu[2][i]==4&&clues[i]==3){
  153.      poss[0][i][2]=0;
  154.      poss[1][i][0]=0;
  155.    }
  156.    if(solu[2][i]==4&&clues[i]==2){
  157.      poss[0][i][0]=0;
  158.      poss[1][i][2]=0;
  159.    }
  160.  }
  161.  
  162.  for(int i=4;i<8;i++){
  163.    if(solu[i%4][0]==4&&clues[i]==2){
  164.      setNmbr(solu,poss,i%4,3,3);
  165.    }
  166.    if(solu[i%4][0]==4&&clues[i]==3){
  167.      poss[i%4][3][2]=0;
  168.      poss[i%4][2][1]=0;
  169.    }
  170.    
  171.    if(solu[i%4][1]==4&&clues[i]==3){
  172.      poss[i%4][3][2]=0;
  173.      poss[i%4][2][0]=0;
  174.    }
  175.    if(solu[i%4][1]==4&&clues[i]==2){
  176.      poss[i%4][3][0]=0;
  177.      poss[i%4][2][2]=0;
  178.    }
  179.  }
  180.  for(int i=8;i<12;i++){
  181.     if(solu[0][3-i%4]==4&&clues[i]==2){
  182.      setNmbr(solu,poss,3,3-i%4,3);
  183.    }
  184.    if(solu[0][3-i%4]==4&&clues[i]==3){
  185.      poss[3][3-i%4][2]=0;
  186.      poss[2][3-i%4][1]=0;
  187.    }
  188.    
  189.    if(solu[1][3-i%4]==4&&clues[i]==3){
  190.      poss[3][3-i%4][2]=0;
  191.      poss[2][3-i%4][0]=0;
  192.    }
  193.    if(solu[1][3-i%4]==4&&clues[i]==2){
  194.      poss[3][3-i%4][0]=0;
  195.      poss[2][3-i%4][2]=0;
  196.    }
  197.  }
  198.  for(int i=12;i<16;i++){
  199.    if(solu[3-i%4][3]==4&&clues[i]==2){
  200.      setNmbr(solu,poss,3-i%4,0,3);
  201.    }
  202.    if(solu[3-i%4][3]==4&&clues[i]==3){
  203.      poss[3-i%4][0][2]=0;
  204.      poss[3-i%4][1][1]=0;
  205.    }
  206.    
  207.    if(solu[3-i%4][2]==4&&clues[i]==3){
  208.      poss[3-i%4][0][2]=0;
  209.      poss[3-i%4][1][0]=0;
  210.    }
  211.    if(solu[3-i%4][2]==4&&clues[i]==2){
  212.      poss[3-i%4][0][0]=0;
  213.      poss[3-i%4][1][2]=0;
  214.    }
  215.  }
  216.  check(solu,poss);
  217.  for(int z=0;z<4;z++){
  218.   for(int y=0;y<4;y++){
  219.     printf("%d ",solu[z][y]);
  220.   }printf("\n");
  221. }
  222.  return solu;
  223. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement