8皇后问题 NOJ 1593

8皇后问题

时间限制(普通/Java) : 2000 MS/ 6000 MS          运行内存限制 : 65536 KByte
总提交 : 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>

版权声明:本文为博主原创文章,未经博主允许不得转载。

posted on 2015-04-10 21:36  Tob__yuhong  阅读(78)  评论(0编辑  收藏  举报

导航