n皇后问题
总提交 : 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皇后问题
总提交 : 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
提示
题目来源
算法设计与实验题解