fork download
  1. #include <stdio.h>
  2. #include <vector>
  3. #include <algorithm>
  4. #include <string.h>
  5. using namespace std;
  6. int korx1[10],kory1[10],start[10],data[5][5],i,j,VISITED[10][10],maks;
  7. vector<int> angka;
  8. bool full(){
  9. for(int i=0;i<4;i++){
  10. for(int j=0;j<4;j++){
  11. if(VISITED[i][j]==0) return false;
  12. }
  13. }
  14. return true;
  15. }
  16. void print(){
  17. int i,j;
  18. printf("\n");
  19. for(i=0;i<4;i++){
  20. for(j=0;j<4;j++){
  21. printf("%d",data[i][j]);
  22. }
  23. printf("\n");
  24. }
  25. }
  26. int isValid(int x,int y,int z){
  27. int valid=0;
  28. if((z==maks)&&(VISITED[x][y]==angka[maks]+5)&&full()) {
  29. //print();
  30. return 1;
  31. }
  32. if((z==maks)&&(VISITED[x][y]==angka[maks]+5)) return 0;
  33. if (VISITED[x][y]==angka[z]+5) return isValid(korx1[angka[z+1]],kory1[angka[z+1]],z+1);
  34. if (x<0 || x>=4 || y<0 || y>=4) return 0;
  35. if (VISITED[x][y]!=0) return 0;
  36. VISITED[x][y]=15;
  37. data[x][y]=angka[z];
  38. valid=valid | isValid(x+1,y,z);
  39. valid=valid | isValid(x-1,y,z);
  40. valid=valid | isValid(x,y+1,z);
  41. valid=valid | isValid(x,y-1,z);
  42. VISITED[x][y]=0;
  43. return valid;
  44. }
  45.  
  46. int main(){
  47. int t;
  48. scanf("%d",&t);
  49. while(t--){
  50. maks=0;
  51. memset(start,0, sizeof(start));
  52. memset(VISITED,0,sizeof VISITED);
  53. for(i=0;i<4;i++){
  54. for(j=0;j<4;j++){
  55. scanf("%d",&data[i][j]);
  56. //maks=max(maks,data[i][j]);
  57. if ((data[i][j]!=0) && (start[data[i][j]]==0)){
  58. korx1[data[i][j]]=i;
  59. kory1[data[i][j]]=j;
  60. start[data[i][j]]=1;
  61. }
  62. else if (data[i][j]&&start[data[i][j]]==1) {
  63. VISITED[i][j]=data[i][j]+5;
  64. angka.push_back(data[i][j]);
  65. }
  66. else VISITED[i][j]=data[i][j];
  67. }
  68. }
  69. maks=angka.size()-1;
  70. //printf("%d\n",maks);
  71. sort(angka.begin(),angka.end());
  72. /*for(int a=0;a<=maks;a++) printf("%d ",angka[a]);
  73.   printf("\n");
  74.   printf("\n");
  75.   print();
  76.   printf("\n");*/
  77. int bisa=isValid(korx1[angka[0]],kory1[angka[0]],0);
  78. if(bisa) printf("SOLVABLE\n");
  79. else printf("UNSOLVABLE\n");
  80. //print();
  81. angka.clear();
  82. }
  83. }
  84.  
Success #stdin #stdout 0s 15240KB
stdin
2
1 3 0 0
0 2 0 3
0 1 0 0
2 0 0 0
4 6 0 0
0 5 0 6
0 4 0 0
5 0 0 0
stdout
SOLVABLE
SOLVABLE