codevs1295 N皇后问题 解题报告
来源:互联网 发布:mysql停用索引 编辑:程序博客网 时间:2024/06/14 01:51
N皇后问题 codevs1295黄金Gold
【问题描述】
在N*N的棋盘上放置N个皇后(n<=10)而彼此不受攻击(即在棋盘的任一行,任一列和任一对角线上不能放置2个皇后),编程求解所有的摆放方法。
【输入格式】
输入:n
【输出格式】
每行输出一种方案,每种方案顺序输出皇后所在的列号,各个数之间有空格隔开。若无方案,则输出no solute!
【输入样例】
4
【输出样例】
2 4 1 3
3 1 4 2
【解题思路】
依然依然是搜索回溯的经典题。因为皇后可以控制它所在的两条对角线,我们发现,棋盘上的对角线都满足这样的特点:要么横纵坐标之和相等,要么横纵坐标之差相等。所以可以用两个判断数组标记两种对角线有没有被皇后控制。。搜索是逐行搜索,每行只有一个皇后,所以不用担心每行的皇后互相冲突,只需要再开一个判断数组标记每一列有没有被皇后控制即可。
a[i]表示横纵坐标之和为i的对角线是否有被皇后控制。。
b[i+n]表示横纵坐标之差为i的对角线是否有被皇后控制。。。因为c++无法处理负数组,所以给每一个i都加上n,就不会出现负数的情况了。。
c[i]表示第i列有没有被皇后控制。。
【代码】
#include<iostream>#include<cstring>#include<cstdio>using namespace std;int a[100],b[100],c[100],d[100],n;bool pd;void print(){int i;for (i=1;i<=n;++i) printf("%5d",d[i]);printf("\n");pd=true;return;}void dfs(int dep){int r;if (dep==n+1) print();for (r=1;r<=n;r++)//逐行搜索,按列循环,dep是行数,r是列数 if (!a[dep+r]&&!b[dep-r+n]&&!c[r])//精髓所在!!!!!(重要的事情打五个!) { d[dep]=r;//d是记录数组 a[dep+r]=1; b[dep-r+n]=1; c[r]=1; dfs(dep+1); a[dep+r]=0;//回溯一步 b[dep-r+n]=0; c[r]=0; }return;}int main(){scanf("%d",&n);pd=false;dfs(1);if (pd==false) printf("no solute!");return 0;}
0 0
- codevs1295 N皇后问题 解题报告
- 【codevs1295】 N皇后问题
- N皇后问题解题报告
- hdu 2553 N皇后问题 解题报告
- 【codevs1295 N皇后问题(不输出方案)】回溯法
- 【codevs1295 N皇后问题(不输出方案)】回溯法
- DFS——A:N皇后问题 解题报告
- Leetcode #51&52 N-Queens I&II N皇后问题 1&2 解题报告
- [解题报告]POJ-2698-八皇后问题
- jzoj 1578. 【普及模拟】N皇后 解题报告
- N*N皇后问题
- N!解题报告
- HDU1042 N! 解题报告
- 八皇后 n皇后 问题
- 八皇后N皇后问题
- leetCode 51.N-Queens (n皇后问题) 解题思路和方法
- leetCode 52.N-Queens II (n皇后问题II) 解题思路和方法
- hdoj 1207(解决n=64问题)解题报告
- 'register_android_system_OsConstants(_JNIEnv*)'解决方案
- leetcode_Maximum Product Subarray
- 面试题6
- 本田CRV被曝轮胎速度级别等同3万元小面包车
- 怎样为孩子30年后做打算。
- codevs1295 N皇后问题 解题报告
- spring4.0整合mongodb3.0.4项目实践(用户验证)
- C. Amr and Chemistry(Codeforces Round #312 (Div. 2) 二进制+暴力)
- 生活
- 【NoSql】Redis实践篇-简单demo实现(一)
- 《你的知识需要管理》
- DCEVM
- CRM
- 分享二