• 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("
    ");
            */
            search(0);
          // cout<<ff<<endl;
            if(ff==0)
            {
               printf("Case %d: Yes
    ",temp-n);
            }
            else
            {
                printf("Case %d: No
    ",temp-n);
            }
        }
    }</span>

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

  • 相关阅读:
    Freemaker Replace函数的正则表达式运用
    [Android]使用Spring for Android改善数据交互流程
    [Freemarker]自定义时间戳函数
    [jquery.validate]自定义方法实现"手机号码或者固定电话"的逻辑验证
    [Javascript]网页链接加上时间戳防止串用户
    支付系统设计
    java设计模式-抽象工厂模式
    IDEA解决maven多module出现多root的问题
    java设计模式-工厂方法模式
    java设计模式-单例模式
  • 原文地址:https://www.cnblogs.com/Tobyuyu/p/4965564.html
Copyright © 2020-2023  润新知