OpenJudge 2.5-1700这还是一道玄学题!DFS

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OpenJudge 2.5-1700这还是一道玄学题!DFS相关的知识,希望对你有一定的参考价值。

描述

在国际象棋棋盘上放置八个皇后,要求每两个皇后之间不能直接吃掉对方。输入无输入。输出按给定顺序和格式输出所有八皇后问题的解(见Sample Output)。

样例输出

No. 1
1 0 0 0 0 0 0 0 
0 0 0 0 0 0 1 0 
0 0 0 0 1 0 0 0 
0 0 0 0 0 0 0 1 
0 1 0 0 0 0 0 0 
0 0 0 1 0 0 0 0 
0 0 0 0 0 1 0 0 
0 0 1 0 0 0 0 0 
No. 2
1 0 0 0 0 0 0 0 
0 0 0 0 0 0 1 0 
0 0 0 1 0 0 0 0 
0 0 0 0 0 1 0 0 
0 0 0 0 0 0 0 1 
0 1 0 0 0 0 0 0 
0 0 0 0 1 0 0 0 
0 0 1 0 0 0 0 0 
No. 3
1 0 0 0 0 0 0 0 
0 0 0 0 0 1 0 0 
0 0 0 0 0 0 0 1 
0 0 1 0 0 0 0 0 
0 0 0 0 0 0 1 0 
0 0 0 1 0 0 0 0 
0 1 0 0 0 0 0 0 
0 0 0 0 1 0 0 0 
No. 4
1 0 0 0 0 0 0 0 
0 0 0 0 1 0 0 0 
0 0 0 0 0 0 0 1 
0 0 0 0 0 1 0 0 
0 0 1 0 0 0 0 0 
0 0 0 0 0 0 1 0 
0 1 0 0 0 0 0 0 
0 0 0 1 0 0 0 0 
No. 5
0 0 0 0 0 1 0 0 
1 0 0 0 0 0 0 0 
0 0 0 0 1 0 0 0 
0 1 0 0 0 0 0 0 
0 0 0 0 0 0 0 1 
0 0 1 0 0 0 0 0 
0 0 0 0 0 0 1 0 
0 0 0 1 0 0 0 0 
No. 6
0 0 0 1 0 0 0 0 
1 0 0 0 0 0 0 0 
0 0 0 0 1 0 0 0 
0 0 0 0 0 0 0 1 
0 1 0 0 0 0 0 0 
0 0 0 0 0 0 1 0 
0 0 1 0 0 0 0 0 
0 0 0 0 0 1 0 0 
No. 7
0 0 0 0 1 0 0 0 
1 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 1 
0 0 0 1 0 0 0 0 
0 1 0 0 0 0 0 0 
0 0 0 0 0 0 1 0 
0 0 1 0 0 0 0 0 
0 0 0 0 0 1 0 0 
No. 8
0 0 1 0 0 0 0 0 
1 0 0 0 0 0 0 0 
0 0 0 0 0 0 1 0 
0 0 0 0 1 0 0 0 
0 0 0 0 0 0 0 1 
0 1 0 0 0 0 0 0 
0 0 0 1 0 0 0 0 
0 0 0 0 0 1 0 0 
No. 9
0 0 0 0 1 0 0 0 
1 0 0 0 0 0 0 0 
0 0 0 1 0 0 0 0 
0 0 0 0 0 1 0 0 
0 0 0 0 0 0 0 1 
0 1 0 0 0 0 0 0 
0 0 0 0 0 0 1 0 
0 0 1 0 0 0 0 0 
...以下省略

没错这是一道基础题,但是为什么我要写一遍呢?

因为这道题很玄学!因为是八皇后嘛,所以我数组开的10我想应该够了,结果一直WA WA WA,最后我整个人都要哇了!

我不得不找Reddest大佬来帮我看程序

他也很久没有找出来问题,然后,他突然跟我说:你把数组开大试一试?

于是我残暴地往10后面加了两个0(大家不要学我),再提交,就AC了!

你说玄学不玄学。

看来我还是要提高自己的知识水平啊!
#include<stdio.h>
int x[1000],y[1000],h[1000],l[1000],pos[10],cnt;
void print()
{
    printf("No. %d\n",++cnt);
    for(int i=1;i<=8;i++)
    {
        for(int j=1;j<=8;j++)
        {
            if(i==pos[j])printf("1 ");
            else printf("0 ");
        }
        printf("\n");
    }
    
}
void DFS(int k)
{
    for(int i=1;i<=8;i++)
    {
        if(!h[k]&&!l[i]&&!x[k-i+9]&&!y[k+i])
        {
            pos[k]=i;
            h[k]=1;
            l[i]=1;
            x[k-i+9]=1;
            y[k+i]=1;
            
            if(k==8)print();
            else DFS(k+1);
            h[k]=0;
            l[i]=0;
            x[k-i+9]=0;
            y[k+i]=0;
            pos[k]=0;
        }
    }
}
int main()
{
    DFS(1);
    return 0;
}

P.S.这道题你本地测试的时候输出应该有92组,只要都不同应该就是对的。

以上是关于OpenJudge 2.5-1700这还是一道玄学题!DFS的主要内容,如果未能解决你的问题,请参考以下文章

openjudge-NOI 2.5-1700 八皇后问题

P1024 一道naive的二分

刷题向》关于一道比较优秀的递推型DP(openjudge9275)(EASY+)

代码简洁之道:一行Python代码解决问题是时尚还是玄学

P3931 SAC E#1 - 一道难题 Tree

openjudge 1792 迷宫 解析报告