8皇后问题
时间限制(普通/Java)
:
2000 MS/ 6000 MS 运行内存限制 : 65536 KByte
总提交 : 1121 测试通过 : 139
总提交 : 1121 测试通过 : 139
题目描述
在8×8格的国际象棋上摆放八个皇后,请你判断她们是否互相攻击,即任意两个皇后都处于同一行、或同一列或同一斜线上。
输入
输入包含多个测试用例(不超过104)。先给出测试用例数。然后是每个测试用例。每个测试用例包括8行,每一行用8个字符表示棋盘上皇后放置情况,“Q”代表皇后,“#”代表空。
输出
对于每个测试用例,输出一行,依次包含:
l “Case #: ”,#表示序号
l 如果测试用例中的八个皇后互相攻击,输出Yes,否则输出No
样例输入
2
Q#######
###Q####
#####Q##
##Q#####
#######Q
####Q###
######Q#
##Q#####
#######Q
###Q####
Q#######
##Q#####
#####Q##
#Q######
######Q#
####Q###
样例输出
Case 1: Yes
Case 2: No
使用回溯会超时,之前使用的回溯一直TL也是醉了,后来改了改代码,不使用回溯就AC了。
实现代码:
<span style="font-size:12px;">#include<iostream>
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
using namespace std;
int C[8],ff,n,temp;
char a[8][8];
void search(int cur)
{
int i,j;
for(i=0;i<8;i++){
if(cur==8) {ff=1;return ;}
for(j=0;j<cur;j++) //检查是否冲突
//C[cur]==C[j]用来检查纵向是否冲突
//cur-C[cur]==j-C[j]||cur+C[cur]==j+C[j]用来检查对角线是否冲突
if(C[cur]==C[j]||cur-C[cur]==j-C[j]||cur+C[cur]==j+C[j]){
ff=0; return ;
}
cur++; //之前使用回溯代码是:if(ff) search(cur+1);
}
}
int main()
{
// freopen("data.in","r",stdin);
scanf("%d",&n);
temp=n;
getchar();
while(n--)
{
ff=1;
for(int i=0;i<8;i++)
{
for(int j=0;j<8;j++)
{
scanf("%c",&a[i][j]);
if(a[i][j]=='Q')
{
C[i]=j;
}
}
getchar();
}
//测试C[]值是否正确,经测试正确
/*
for(int i=0;i<8;i++)
{
printf("%d ",C[i]);
}
printf("\n");
*/
search(0);
// cout<<ff<<endl;
if(ff==0)
{
printf("Case %d: Yes\n",temp-n);
}
else
{
printf("Case %d: No\n",temp-n);
}
}
}</span>