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列摆放皇后的右对角线是否已摆放皇后。
源代码:
题意:
该题即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; }
相关文章推荐
- 积偶判断 计算您的结婚时间
- 无线网络覆盖
- iOS 新浪微博-1.0框架搭建
- (leetcode)Plus One
- laravel小抄
- HDOJ 1241 Oil Deposits【最大连通块 dfs】
- C语言-VS2010调试tips
- HDOJ 1241 Oil Deposits【最大连通块 dfs】
- 精灵进程的创建
- C#委托(Delegate)学习日记
- PCA + SVM 人脸识别
- hdu 5340 Three Palindromes
- 有向图的欧拉回路及欧拉道路
- java中的I/O流
- Nutch2.2.1 开发环境搭建
- javascript设计模式之Mediator(中介者)模式
- WRL 类库项目模板
- BFS POJ 3126 Prime Path
- SSH学习九 依赖注入及加载Spring配置文件的方法
- 20150802-泛型