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(" "); */ search(0); // cout<<ff<<endl; if(ff==0) { printf("Case %d: Yes ",temp-n); } else { printf("Case %d: No ",temp-n); } } }</span>
版权声明:本文为博主原创文章,未经博主允许不得转载。