Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define SSSIZE 4
- void setNmbr(int **solu,int poss[SSSIZE][SSSIZE][SSSIZE],int x,int y,int val){
- solu[x][y]=val;
- for(int i=0;i<SSSIZE;i++){
- poss[x][y][i]=0;
- poss[x][i][val-1]=0;
- poss[i][y][val-1]=0;
- }
- printf("%d,%d,%d\n",x,y,val);
- }
- void check(int **solu,int poss[SSSIZE][SSSIZE][SSSIZE]){
- int found=0;
- for(int i=0;i<SSSIZE;i++){
- int nums[SSSIZE];
- for(int i=0;i<SSSIZE;i++){
- nums[i]=0;
- }
- for(int j=0;j<SSSIZE;j++){
- int zeros=0;
- for(int k=0;k<4;k++){
- if(poss[i][j][k]){
- nums[poss[i][j][k]-1]++;
- }else{
- zeros++;
- }
- }
- if(zeros==3){
- for(int k=0;k<SSSIZE;k++){
- if(poss[i][j][k]){
- setNmbr(solu,poss,i,j,poss[i][j][k]);
- found=1;
- }
- }
- }
- }
- for(int m=0;m<SSSIZE;m++){
- if(nums[m]==1){
- for(int j=0;j<SSSIZE;j++){
- if(poss[i][j][m]){
- setNmbr(solu,poss,i,j,m+1);
- found=1;
- }
- }
- }
- }
- }
- if(found){
- check(solu,poss);
- }
- }
- int** SolvePuzzle (int *clues) {
- int **solu = (int **)malloc(4 * sizeof(int *));
- int row;
- for (row = 0; row < 4; row++) {
- solu[row] = (int *)malloc(4 * sizeof(int));
- }
- for(int i=0;i<4;i++){
- for(int j=0;j<4;j++){
- solu[i][j]=0;
- }
- }
- int poss[4][4][4]={{{1,2,3,4},{1,2,3,4},{1,2,3,4},{1,2,3,4}},
- {{1,2,3,4},{1,2,3,4},{1,2,3,4},{1,2,3,4}},
- {{1,2,3,4},{1,2,3,4},{1,2,3,4},{1,2,3,4}},
- {{1,2,3,4},{1,2,3,4},{1,2,3,4},{1,2,3,4}}};
- for(int i=0;i<4;i++){
- switch(clues[i]){
- case 0: break;
- case 1: setNmbr(solu,poss,0,i,4);
- break;
- case 2: poss[0][i][3]=0;
- break;
- case 3: poss[0][i][3]=0;
- poss[1][i][3]=0;
- break;
- case 4: setNmbr(solu,poss,0,i,1);
- setNmbr(solu,poss,1,i,2);
- setNmbr(solu,poss,2,i,3);
- setNmbr(solu,poss,3,i,4);
- break;
- }
- }
- for(int i=4;i<8;i++){
- switch(clues[i]){
- case 0: break;
- case 1: setNmbr(solu,poss,i%4,3,4);
- break;
- case 2: poss[i%4][3][3]=0;
- break;
- case 3: poss[i%4][3][3]=0;
- poss[i%4][2][3]=0;
- break;
- case 4: setNmbr(solu,poss,i%4,0,4);
- setNmbr(solu,poss,i%4,1,3);
- setNmbr(solu,poss,i%4,2,2);
- setNmbr(solu,poss,i%4,3,1);
- break;
- }
- }
- for(int i=8;i<12;i++){
- switch(clues[i]){
- case 0: break;
- case 1: setNmbr(solu,poss,3,3-(i%4),4);
- break;
- case 2: poss[3][3-(i%4)][3]=0;
- break;
- case 3: poss[3][3-(i%4)][3]=0;
- poss[2][3-(i%4)][3]=0;
- break;
- case 4: setNmbr(solu,poss,0,3-(i%4),4);
- setNmbr(solu,poss,1,3-(i%4),3);
- setNmbr(solu,poss,2,3-(i%4),2);
- setNmbr(solu,poss,3,3-(i%4),1);
- break;
- }
- }
- for(int i=12;i<16;i++){
- switch(clues[i]){
- case 0: break;
- case 1: setNmbr(solu,poss,3-(i%4),0,4);
- break;
- case 2: poss[3-(i%4)][0][3]=0;
- break;
- case 3: poss[3-(i%4)][0][3]=0;
- poss[3-(i%4)][1][3]=0;
- break;
- case 4: setNmbr(solu,poss,3-(i%4),0,1);
- setNmbr(solu,poss,3-(i%4),1,2);
- setNmbr(solu,poss,3-(i%4),2,3);
- setNmbr(solu,poss,3-(i%4),3,4);
- break;
- }
- }
- check(solu,poss);
- for(int i=0;i<4;i++){
- if(solu[3][i]==4&&clues[i]==2){
- setNmbr(solu,poss,0,i,3);
- }
- if(solu[3][i]==4&&clues[i]==3){
- poss[0][i][2]=0;
- poss[1][i][1]=0;
- }
- if(solu[2][i]==4&&clues[i]==3){
- poss[0][i][2]=0;
- poss[1][i][0]=0;
- }
- if(solu[2][i]==4&&clues[i]==2){
- poss[0][i][0]=0;
- poss[1][i][2]=0;
- }
- }
- for(int i=4;i<8;i++){
- if(solu[i%4][0]==4&&clues[i]==2){
- setNmbr(solu,poss,i%4,3,3);
- }
- if(solu[i%4][0]==4&&clues[i]==3){
- poss[i%4][3][2]=0;
- poss[i%4][2][1]=0;
- }
- if(solu[i%4][1]==4&&clues[i]==3){
- poss[i%4][3][2]=0;
- poss[i%4][2][0]=0;
- }
- if(solu[i%4][1]==4&&clues[i]==2){
- poss[i%4][3][0]=0;
- poss[i%4][2][2]=0;
- }
- }
- for(int i=8;i<12;i++){
- if(solu[0][3-i%4]==4&&clues[i]==2){
- setNmbr(solu,poss,3,3-i%4,3);
- }
- if(solu[0][3-i%4]==4&&clues[i]==3){
- poss[3][3-i%4][2]=0;
- poss[2][3-i%4][1]=0;
- }
- if(solu[1][3-i%4]==4&&clues[i]==3){
- poss[3][3-i%4][2]=0;
- poss[2][3-i%4][0]=0;
- }
- if(solu[1][3-i%4]==4&&clues[i]==2){
- poss[3][3-i%4][0]=0;
- poss[2][3-i%4][2]=0;
- }
- }
- for(int i=12;i<16;i++){
- if(solu[3-i%4][3]==4&&clues[i]==2){
- setNmbr(solu,poss,3-i%4,0,3);
- }
- if(solu[3-i%4][3]==4&&clues[i]==3){
- poss[3-i%4][0][2]=0;
- poss[3-i%4][1][1]=0;
- }
- if(solu[3-i%4][2]==4&&clues[i]==3){
- poss[3-i%4][0][2]=0;
- poss[3-i%4][1][0]=0;
- }
- if(solu[3-i%4][2]==4&&clues[i]==2){
- poss[3-i%4][0][0]=0;
- poss[3-i%4][1][2]=0;
- }
- }
- check(solu,poss);
- for(int z=0;z<4;z++){
- for(int y=0;y<4;y++){
- printf("%d ",solu[z][y]);
- }printf("\n");
- }
- return solu;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement