N皇后问题
TIP:深度优先搜索基本流程
检查函数
搜索函数:先写递归的终止条件,在写判定
在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。
你的任务是,对于给定的N,求出有多少种合法的放置方法。
Input
共有若干行,每行一个正整数N≤10,表示棋盘和皇后的数量;如果N=0,表示结束。
Output
共有若干行,每行一个正整数,表示对应输入行的皇后的不同放置数量。
Sample Input
1
8
5
0
Sample Output
1
92
10
我写的代码
#include<iostream> #include<algorithm> using namespace std; struct queen{ int x,y;//皇后的坐标 }; int n,sum=0; queen q[16]; int b[10]; bool inPlace(int t){ for(int k=1;k<t;k++){ if(q[k].x==q[t].x||q[k].y==q[t].y||abs(q[k].x-q[t].x)==abs(q[k].y-q[t].y))return 0; } // cout<<q[t].x<<q[t].y<<endl; return 1; } int Search(int t,int n){ if(t>n)sum++; else for(int i=1;i<=n;i++){//行 q[t].x=i;// q[t].y=t;// if(inPlace(t)){Search(t+1,n);//如果t满足条件 则继续寻找t+1个皇后 } } return sum; } int main(){ for (int i = 0; i < 10; i++) {//打表 ,如果不这样提交一直超时 queen *q=new queen[n]; sum = 0; b[i] = Search(1,i+1); } while(cin>>n){ if(n==0)break; // queen *q=new queen[n];//建立n个皇后 // sum=0;//sum为寻找到的满足条件的皇后数 cout<<b[n-1]<<endl;//寻找皇后 //cout<<sum<<endl; } return 0; }
老师写的
#include<iostream> #include<cstdio> #include<cstring> using namespace std; const int maxn = 6; int ans; bool G[maxn][maxn]; int n; bool check(int x, int y, int n) { for (int i = 0; i < n ; i++){ if (G[i][y]) return false; if (G[x][i]) return false; } for (int i = 0; i < n; i++) { if (y - x + i >= 0 && y - x + i < n && G[i][y - x + i]) return false; if (y + x - i >= 0 && y + x - i < n && G[i][y + x - i]) return false; } return true; } void dfs(int x, int n) { if (x == n) { ans++; /*printf("\n"); for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) printf("%d", G[i][j]); printf("\n"); }*/ return; } for (int i = 0; i < n; i++) { if (check(x, i, n)) { G[x][i] = true; dfs(x + 1, n); G[x][i] = false; } } } int main() { /*int n = 4; int x = 2, y = 1; for (int i = 0; i < n; i++) { if(y - x + i >= 0 && y - x + i < n) printf("(%d,%d) ", i, y - x + i); if (y + x - i >= 0 && y + x - i < n)printf("(%d,%d)", i, y + x - i); printf("\n"); }*/ int b[maxn]; for (int i = 0; i < maxn; i++) {//打表 memset(G, 0, sizeof(G)); ans = 0; dfs(0, i); b[i] = ans; } while (scanf("%d", &n) != EOF) { if (n == 0) break; printf("%d\n", b[n]); } return 0; }