n皇后问题 NOJ 1319
来源:互联网 发布:北京软件大学 编辑:程序博客网 时间:2024/06/06 14:51
n皇后问题
时间限制(普通/Java) : 1000 MS/ 3000 MS 运行内存限制 : 65536 KByte
总提交 : 114 测试通过 : 25
题目描述
在n×n 格的棋盘上放置彼此不受攻击的n 个皇后。按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。n后问题等价于在n×n格的棋盘上放置n个皇后,任何2 个皇后不放在同一行或同一列或同一斜线上。设计一个解n 后问题的队列式分支限界法,计算在n´ n个方格上放置彼此不受攻击的n个皇后的一个放置方案。
输入
第一行有1 个正整数n。
输出
将计算出的彼此不受攻击的n个皇后的一个放置方案输出。第1行是n个皇后的放置方案。
样例输入
5
样例输出
1 3 5 2 4
这一题很坑的就是输出,居然没有换行符!某学长替我PE了n次啊!
ff用来判断是否到达边界~
#include<iostream>#include<stdlib.h>#include<stdio.h>#include<string.h>using namespace std;int vis[1000][1000];//int vis[1000];int C[1000];int tot=0;int n;int ff,sum=0;void search(int cur){ int i; if(cur==n) { ff=1; return; } else for(i=0;i<n;i++) { if(!vis[0][i]&&!vis[1][cur+i]&&!vis[2][cur-i+n]) { C[cur]=i; sum+=C[cur]; vis[0][i]=vis[1][cur+i]=vis[2][cur-i+n]=1; search(cur+1); if(ff==1) return ; vis[0][i]=vis[1][cur+i]=vis[2][cur-i+n]=0; } }}/*void search(int cur,int n){ int i,j; if(cur==n) tot++; else for(i=0;i<n;i++) { int ok=1; C[cur]=i; for(j=0;j<cur;j++) if(C[cur]==C[j]||cur-C[cur]==j-C[j]||cur+C[cur]==j+C[j]) { ok=0; break; } if(ok) search(cur+1,n); }}*/int main(){ while(scanf("%d",&n)==1) { ff=0; for(int i=0;i<n;i++) { C[i]=0; } memset(vis,0,sizeof(vis)); search(0); for(int i=0;i<n;i++) { if(n!=2&&n!=3) { if(i==0) printf("%d",C[0]+1); else printf(" %d",C[i]+1); } } printf(" "); }}
总提交 : 114 测试通过 : 25
题目描述
在n×n 格的棋盘上放置彼此不受攻击的n 个皇后。按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。n后问题等价于在n×n格的棋盘上放置n个皇后,任何2 个皇后不放在同一行或同一列或同一斜线上。设计一个解n 后问题的队列式分支限界法,计算在n´ n个方格上放置彼此不受攻击的n个皇后的一个放置方案。
输入
第一行有1 个正整数n。
输出
将计算出的彼此不受攻击的n个皇后的一个放置方案输出。第1行是n个皇后的放置方案。
样例输入
5
样例输出
1 3 5 2 4
这一题很坑的就是输出,居然没有换行符!某学长替我PE了n次啊!
ff用来判断是否到达边界~
#include<iostream>#include<stdlib.h>#include<stdio.h>#include<string.h>using namespace std;int vis[1000][1000];//int vis[1000];int C[1000];int tot=0;int n;int ff,sum=0;void search(int cur){ int i; if(cur==n) { ff=1; return; } else for(i=0;i<n;i++) { if(!vis[0][i]&&!vis[1][cur+i]&&!vis[2][cur-i+n]) { C[cur]=i; sum+=C[cur]; vis[0][i]=vis[1][cur+i]=vis[2][cur-i+n]=1; search(cur+1); if(ff==1) return ; vis[0][i]=vis[1][cur+i]=vis[2][cur-i+n]=0; } }}/*void search(int cur,int n){ int i,j; if(cur==n) tot++; else for(i=0;i<n;i++) { int ok=1; C[cur]=i; for(j=0;j<cur;j++) if(C[cur]==C[j]||cur-C[cur]==j-C[j]||cur+C[cur]==j+C[j]) { ok=0; break; } if(ok) search(cur+1,n); }}*/int main(){ while(scanf("%d",&n)==1) { ff=0; for(int i=0;i<n;i++) { C[i]=0; } memset(vis,0,sizeof(vis)); search(0); for(int i=0;i<n;i++) { if(n!=2&&n!=3) { if(i==0) printf("%d",C[0]+1); else printf(" %d",C[i]+1); } } printf(" "); }}
n皇后问题
时间限制(普通/Java) : 1000 MS/ 3000 MS 运行内存限制 : 65536 KByte
总提交 : 114 测试通过 : 25
总提交 : 114 测试通过 : 25
题目描述
在n×n 格的棋盘上放置彼此不受攻击的n 个皇后。按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。n后问题等价于在n×n格的棋盘上放置n个皇后,任何2 个皇后不放在同一行或同一列或同一斜线上。设计一个解n 后问题的队列式分支限界法,计算在n´ n个方格上放置彼此不受攻击的n个皇后的一个放置方案。
输入
第一行有1 个正整数n。
输出
将计算出的彼此不受攻击的n个皇后的一个放置方案输出。第1行是n个皇后的放置方案。
样例输入
5
样例输出
1 3 5 2 4
提示
题目来源
算法设计与实验题解
0 0
- n皇后问题 NOJ 1319
- 8皇后问题 NOJ 1593
- NOJ 1007 8皇后问题
- N*N皇后问题
- 算法练习-NOJ-1007-8皇后问题
- 八皇后 n皇后 问题
- 八皇后N皇后问题
- 南邮 OJ 1319 n皇后问题
- N皇后问题
- n皇后问题
- N皇后问题
- N 皇后问题
- N皇后问题
- N皇后问题算法
- N 皇后问题
- N皇后问题
- N皇后问题
- n皇后问题
- 第34课时,实践1,分数的累加
- xcode git(2)简单示例
- 【C语言】球从100米自由落下,每次落地后反跳回原高度的一半。当10次落地时,共经过多少米,第10次反弹多高。
- 设计模式
- 设计模式之单例模式(Singleton Pattern)C++实现
- n皇后问题 NOJ 1319
- C++ 深度全面学习
- Generate Parentheses - LeetCode
- editText限制输入的4种方法
- 利用jwplayer的API实现播放定时弹出框效果
- HDU1863----畅通工程
- CodeForces 402A Nuts (二分)
- [省选前题目整理][BZOJ 1857][SCOI 2010]传送带(三分套三分)
- 10^n个整数(亿级)的排序 .