在n*n的棋盘上放n个皇后,使得她们互不攻击,此时每个皇后的攻击范围为同行同列和同对角线,要求找出所有解
#include<stdio.h> #include<iostream> #include<stdlib.h> #include<string.h> #include<math.h> #include<queue> #include<stack> #include<algorithm> using namespace std; //关于八皇后问题,其实就是一个简单的深搜,只要把同行和同对角线的全排除掉就行了 //因为cur-i可能小于0,所以加一个n,把数组开大点就行了 int n; int vis[100][100]; int tot; int a[1000]= {0}; void print(int k)//打印图 { int i; int j; for(i = 0; i <n; i ++) { for(j=0; j<a[i]; j++) printf("* "); printf("# "); for(j=a[i]+1; j<n; j++) printf("* "); printf(" "); } printf("=============== "); } void dfs(int cur) { int i; if(cur==n) { tot++; print(a[cur]); } else for(i=0; i<n; i++) { if(!vis[0][i]&&!vis[1][cur+i]&&!vis[2][cur-i+n]) { a[cur]=i; vis[0][i]=vis[1][cur+i]=vis[2][cur-i+n]=1; dfs(cur+1); vis[0][i]=vis[1][cur+i]=vis[2][cur-i+n]=0; } } } int main() { while(~scanf("%d",&n)) { memset(vis,0,sizeof(vis)); tot=0; dfs(0); printf("%d ",tot); } return 0; } //打印8*8的 //#include <iostream> //#include<stdio.h> //using namespace std; // //int a[8] = {0}; //int tot = 0; // //void print()//打印图 //{ // int i; // int j; // for(i = 0; i <8; i ++) // { // for(j = 0; j < a[i]; j ++) // printf("* "); // printf("# "); // for(j = a[i] + 1; j < 8; j ++) // printf("* "); // printf(" "); // } // printf("===================================== "); //} //int fund(int cur, int x)//判断是否和其他皇后同行或同对角线 //{ // int i,x1; // for(i = 0; i < cur; i ++) // { // x1 = a[i]; // if(x == x1) // return 0; // if((i + x1) == (cur + x)) // return 0; // if((i - x1) == (cur - x)) // return 0; // } // return 1; //} //void search(int cur) //{ // int i; // for(i = 0; i < 8; i++) // { // if(fund(cur, i))//如果符合条件 // { // a[cur] = i;//摆放皇后 // if(7 == cur) // { // tot ++, print(); // a[cur] = 0; // return; // } // search(cur + 1); // a[cur] = 0; // } // } //} //int main() //{ // search(0); // printf("total = %d ", tot); // return 1; //}