zoukankan      html  css  js  c++  java
  • 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>

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

  • 相关阅读:
    常见jvm命令
    服务后台启动
    kafka创建topic,生产和消费指定topic消息
    kafka-manager安装
    修改ssh主机名
    设置虚拟机静态ip
    kafka术语
    cas和oauth2的区别
    会Python的大学生,步入职场将会非常抢手!
    python爬虫把url链接编码成gbk2312格式过程解析
  • 原文地址:https://www.cnblogs.com/Tobyuyu/p/4965563.html
Copyright © 2011-2022 走看看