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
这一题很坑的就是输出,居然没有换行符!某学长替我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
提示
题目来源
算法设计与实验题解
版权声明:本文为博主原创文章,未经博主允许不得转载。