真的naive......
我把所有能剪的枝都剪了才过的。否则就是TTT
还有个很神奇的事:数组作为参数传进递归函数时会造成上一层函数里的数组的改变。这个我TM调了一天。
下面奉上代码
1 #include2 #include 3 using namespace std; 4 5 int a[5][5]; 6 int xx,yy; 7 8 9 void dfs(bool b[],int x,int y) 10 { 11 if(y>4) x++,y=1; 12 /* printf("%d %d\n",x,y); 13 for(int i=1;i<=4;i++) 14 { 15 for(int j=1;j<=4;j++) printf("%d ",a[i][j]); 16 printf("\n"); 17 } 18 for(int i=0;i<=3;i++) 19 { 20 for(int j=1;j<=4;j++) printf("%d ",b[i*4+j]); 21 printf("\n"); 22 } 23 printf("\n"); 24 */ 25 if(x==3&&y==4) 26 { 27 a[3][4]=34-a[3][1]-a[3][2]-a[3][3]; 28 if(a[3][4]>16||a[3][4]<1) { return;} 29 30 if(b[a[3][4]]) { return;} 31 32 b[a[3][4]]=1; 33 34 for(int i=1;i<=4;i++) 35 { 36 a[4][i]=34-a[1][i]-a[2][i]-a[3][i]; 37 if(a[4][i]>16||a[4][i]<1) 38 { 39 for(int j=1;j 16||a[x][y]<1) {a[x][y]=0;return;} 74 if(b[a[x][y]]) {a[x][y]=0;return;} 75 if(x==2) if(a[1][3]+a[1][4]+a[2][3]+a[2][4]!=34) {a[x][y]=0;return;} 76 b[a[x][y]]=1; 77 dfs(b,x,y+1); 78 b[a[x][y]]=0; 79 a[x][y]=0; 80 return; 81 } 82 if(x==2&&y==2) 83 { 84 a[x][y]=34-a[1][1]-a[1][2]-a[2][1]; 85 if(x==xx&&y==yy&&a[x][y]!=1) return; 86 if(a[x][y]>16||a[x][y]<1) {a[x][y]=0;return;} 87 if(b[a[x][y]]) {a[x][y]=0;return;} 88 b[a[x][y]]=1; 89 dfs(b,x,y+1); 90 b[a[x][y]]=0; 91 a[x][y]=0; 92 return; 93 } 94 if(x==xx&&y==yy) 95 { 96 a[x][y]=1; 97 if(b[1]) return; 98 b[1]=1; 99 dfs(b,x,y+1);100 a[x][y]=0;101 b[1]=0;102 return;103 }104 for(int i=2;i<=16;i++)105 {106 if(b[i]) continue;107 a[x][y]=i;108 b[i]=1;109 110 dfs(b,x,y+1);111 a[x][y]=0;112 b[i]=0;113 }114 return;115 }116 117 118 int main()119 {120 scanf("%d%d",&xx,&yy);121 bool b[34];122 123 memset(b,0,sizeof(b));124 dfs(b,1,1);125 return 0;126 }
最近开始重温寒假精英班的课程,从打好搜索开始重新打基~~础~~!