练习二 1019 n皇后问题
2016-04-25 16:33
344 查看
题目:
在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。<br>你的任务是,对于给定的N,求出有多少种合法的放置方法。<br><br>
[align=left]Input[/align]
共有若干行,每行一个正整数N≤10,表示棋盘和皇后的数量;如果N=0,表示结束。
[align=left]Output[/align]
共有若干行,每行一个正整数,表示对应输入行的皇后的不同放置数量。
[align=left]Sample Input[/align]
1<br>8<br>5<br>0<br><br>
题目大意:有n个皇后在棋盘上,若将任意两个皇后放在同一排或同一列或成45度角放置则它们将会互相攻击,求出使其不互相攻击放置的方法数目。
解题思路:回溯法+递归。我们可以以行优先,就是说皇后的行号按顺序递增,只考虑第i个皇后放置在第i行的哪一列,所以在放置第i个皇后的时候,可以从第1列判断起,如果可以放置在第1个位置,则跳到下一行放置下一个皇后。如果不能,则跳到下一列...直到最后一列,如果最后一列也不能放置,则说明此时放置方法出错,则回到上一个皇后向之前放置的下一列重新放置,最终可求出结果。
感想:n皇后问题的复杂程度还是蛮高的,虽然有类似题目但还是好长时间没做出来,不过因为n<=10,所以可以直接水一波算出前十的解直接代入就好。。
水题代码:
#include<iostream>
#include<cmath>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<iomanip>
#include<cstdio>
using namespace std;
int main()
{
int p[10]={1,0,0,2,10,4,40,92,352,724};
int n;
while(cin>>n&&n!=0)
{
cout<<p[n-1]<<endl;
}
return 0;
}
代码:
在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。<br>你的任务是,对于给定的N,求出有多少种合法的放置方法。<br><br>
[align=left]Input[/align]
共有若干行,每行一个正整数N≤10,表示棋盘和皇后的数量;如果N=0,表示结束。
[align=left]Output[/align]
共有若干行,每行一个正整数,表示对应输入行的皇后的不同放置数量。
[align=left]Sample Input[/align]
1<br>8<br>5<br>0<br><br>
题目大意:有n个皇后在棋盘上,若将任意两个皇后放在同一排或同一列或成45度角放置则它们将会互相攻击,求出使其不互相攻击放置的方法数目。
解题思路:回溯法+递归。我们可以以行优先,就是说皇后的行号按顺序递增,只考虑第i个皇后放置在第i行的哪一列,所以在放置第i个皇后的时候,可以从第1列判断起,如果可以放置在第1个位置,则跳到下一行放置下一个皇后。如果不能,则跳到下一列...直到最后一列,如果最后一列也不能放置,则说明此时放置方法出错,则回到上一个皇后向之前放置的下一列重新放置,最终可求出结果。
感想:n皇后问题的复杂程度还是蛮高的,虽然有类似题目但还是好长时间没做出来,不过因为n<=10,所以可以直接水一波算出前十的解直接代入就好。。
水题代码:
#include<iostream>
#include<cmath>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<iomanip>
#include<cstdio>
using namespace std;
int main()
{
int p[10]={1,0,0,2,10,4,40,92,352,724};
int n;
while(cin>>n&&n!=0)
{
cout<<p[n-1]<<endl;
}
return 0;
}
代码:
#include<iostream> #include<cstdio> #include<sstream> #include<iomanip> using namespace std; #define N 15 int n; //皇后个数 int sum=0; //可行解个数 int x ; //皇后放置的列数 int place(int k) { int i; for(i=1;i<k;i++) if(abs(k-i)==abs(x[k]-x[i])||x[k]==x[i]) return 0; return 1; } int queen(int t) { if(t>n) //当放置的皇后超过n时,可行解个数加1,此时n必须大于0 sum++; else for(int i=1;i<=n;i++) { x[t]=i; //标明第t个皇后放在第i列 if(place(t)) //如果可以放在某一位置,则继续放下一皇后 queen(t+1); } return sum; } int main() { int t; while(cin>>n) { sum=0; if(n==0) break; cout<<queen(1)<<endl; } return 0; }
相关文章推荐
- hdu_5671_Matrix(BestCoder Round #81 (div2))
- mysql 主从设计
- AVAYA AEP运维之PostgreSQL数据库相关
- URAL 1851|GOV-internship|最小割
- RobotFramework自动化测试之环境搭建安装教程(一)
- JavaScript笔记5--模板引擎
- virtureBox(win7)中实现与主机(ubuntu14.04)usb共享
- 關於js繼承實現
- java执行cmd命令和linux命令
- flume高并发优化——(1)load_balance
- Eclipse SVN插件与TortoiseSVN的对应关系及下载链接
- Instr()函数用法
- 334. Increasing Triplet Subsequence
- angularjs自定义指令(下)
- SoapUI之webservice接口测试(一)
- 并查集
- Lombok 安装、入门 - 消除冗长的 java 代码
- 第八周学习进度条
- mysql从文件中导入数据
- listview中使用checkbox滑动或者加载更多数据错乱问题解决方案