八皇后问题 DFS,回溯剪枝 //http://poj.grids.cn/practice/2698
就是DFS,一出现同行,同列或同对角线,就不往下搜了,就叫剪枝,然后一到出现一个可行解,输出来。记得再递归调用回退的时候要“恢复现场”
贴代码:
View Code
1 //http://poj.grids.cn/practice/2698 2 #include <cstdio> 3 #include <cstring> 4 bool a[10][10]; 5 int cur=0; 6 //开始考虑放第i行 7 void DFS(int i) 8 { 9 int j,k; 10 if(i == 8)//得到一个可行解 11 { 12 printf("No. %d\n",++cur); 13 for(j=0; j<8; ++j) 14 { 15 for(k=0; k<8; ++k) 16 { 17 if(k!=0) printf(" "); 18 printf("%d",a[k][j]); 19 } 20 puts(""); 21 } 22 return ; 23 } 24 for(j=0; j<8; ++j) 25 { 26 bool flag = true;//判断这样放是否可行 27 for(k=0; k<i &&flag; ++k) 28 { 29 for(int t=0; t<8; ++t) 30 { 31 if(a[k][t] && (t == j|| t-j == k-i || t-j == i-k)) 32 { 33 flag = false; 34 break; 35 } 36 } 37 } 38 if(flag)//可行,就这样放 39 { 40 a[i][j] = 1; 41 DFS(i+1); 42 a[i][j] =0;//回退了的时候恢复现场 43 } 44 } 45 } 46 int main() 47 { 48 memset(a,0,sizeof(a)); 49 DFS(0); 50 return 0; 51 }