您的位置:首页 > 其它

Checker Challenge

2015-08-02 20:00 302 查看
题目链接:http://acm.hust.edu.cn/vjudge/problem/visitOriginUrl.action?id=60489

题意:

该题即n皇后问题。给定n行n列,摆放n皇后,使得它们互不攻击。每个皇后攻击范围为同行同列和对角线。

输入:单行输入n,表示给定n*n的棋盘,摆放n个皇后。

输出:若n大于3,则前三行输出找出的前三个方案(每个方案占一行),第四行输出方案数,否则(n<3)输出所有方案后(每个方案占一行),单行输出方案数。
案例:

Sample Input

6

Sample Output

2 4 6 1 3 5
3 6 2 5 1 4
4 1 5 2 6 3
4

分析:

类似于八皇后问题,采用回溯法。

以下代码中:"!vis[0][j]"表示判断j列是否已有皇后,

"!vis[1][cur+j]"表示判断在j列摆放皇后的左对角线是否已摆放皇后,

"!vis[2][cur-j+n]"表示判断在j列摆放皇后的右对角线是否已摆放皇后。
源代码:

#include<iostream>
using namespace std;
int n,tot;
int vis[50][50],C[15];
void search(int cur)
{
int i,j;
if(cur==n)//皇后摆放完毕
{
tot++;
if(tot<=3)//输出前三个案例
{
for(i=0;i<n-1;i++)
cout<<C[i]+1<<' ';
cout<<C[n-1]+1<<endl;
}
}
else for(j=0;j<n;j++)
{
if(!vis[0][j]&&!vis[1][cur+j]&&!vis[2][cur-j+n])//判断是否与前面已摆放的皇后冲突
{
C[cur]=j;//记录皇后摆放的列的位置
vis[0][j]=vis[1][cur+j]=vis[2][cur-j+n]=1;//修改全局变量
search(cur+1);//摆放下一皇后
vis[0][j]=vis[1][cur+j]=vis[2][cur-j+n]=0;//清除记录
}
}
}
int main()
{
cin>>n;
tot=0;//案例数
search(0);
cout<<tot<<endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: