|
发表于 2014-4-21 16:22:46
|
显示全部楼层
回溯只需要用8!次来解。。。4万次计算而已。。
8^8可是1千600多万种结果。。这是穷举的方法。。不是递归
递归和穷举有区别。这个在放皇后之前有用notDanger去查是否可以放,不可以放就直接跳过该格子。具体多少次计算我也不大会算。但这绝对不是穷举的方法。
附上我学过的代码。
- #include <cstdio>
- #include <cstdlib>
- #include <cstring>
- int row[8];
- int tc,a,b,solc;
- bool place (int r, int c){
- for (int prev=0;prev<c;prev++){
- if (row[prev]==r||(abs(prev-c)==abs(row[prev]-r)))return false;
- }
- return true;
- }
- void backtrack(int n){
- if (n==8){
- printf("第%d种\n",++solc);
- for (int j=0;j<8;j++){
- for (int i=0;i<8;i++){
- if (row[i]==j)printf ("1 ");
- else printf("0 ");
- }
- printf("\n");
- }
-
- }
-
- for (int r=0;r<8;r++){
- if (place(r,n)){
- row[n]=r;
- backtrack(n+1);
- }
- }
-
- }
- int main()
- {
- memset(row,0,sizeof(row));
- solc=0;
- backtrack(0);
- return 0;
- }
复制代码 |
|