n皇后
在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("\n");
}
printf("===============\n");
}
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\n",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("\n");
// }
// printf("=====================================\n");
//}
//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\n", tot);
// return 1;
//}

浙公网安备 33010602011771号