【C/C++】八皇后问题

2020-06-05  本文已影响0人  仍有不归期

这些题目都是大一刚入学时学习C语言的课后作业,在OJ上看到还保留着,就都整理下发出来吧......(只有题和代码)

【问题描述】

八皇后问题是一个以国际象棋为背景的问题:如何能够在 8×8 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后。为了达到此目的,任两个皇后都不能处于同一条横行、纵行或斜线上。例如下图就是八皇后问题的一个解:

[图片上传中...(image-793ec7-1589114759889-0)]

假如一棋盘已经正确放置了七个皇后,编写程序求解最后一个皇后的放置位置。

【输入形式】

按照棋盘列由小到大的顺序从控制台输入已正确放置的皇后的行数(行数从1开始计数),未放置皇后的列以字符“”表示。各行数和字符“”之间没有任何其它字符分隔,在输入末尾有回车换行符。例如:上图棋盘假如第5列没有放置皇后,其它七个皇后都已放置完毕,则输入的形式为:4815*263。

【输出形式】

在标准输出上输出最后一个皇后应该放置的行数(行数大于等于1,小于等于8,行数后的回车换行可有可无)。若无解,则输出字符串:No Answer。

【输入样例1】

481*7263

【输出样例1】

5

【样例1说明】

根据输入样例,在棋盘的第一列、第四行位置放置了一皇后,同样在第二列、第八行,第三列、第一行,第五列、第七行,第六列、第二行,第七列、第六行,第八列、第三行也分别放置了一皇后,第四列没有放置皇后。那么为了满足八皇后问题的要求,我们只有在第四列、第五行放置一皇后,所以输出行数为5。

【输入样例2】

1526374*

【输出样例2】

No Answer

【样例2说明】

根据输入样例,在棋盘的第一列、第一行,第二列、第五行,第三列、第二行,第四列、第六行,第五列、第三行,第六列、第七行,第七列、第四行分别放置了一皇后,第八列没有放置皇后。但是根据八皇后问题的要求,前七个皇后放置之后,第八列任何位置都不能放置皇后,否则就会被吃掉。所以输出:No Answer。

算法提示:每输入一个皇后的位置,就将与该皇后同行、同列、同斜线的棋盘位置填满,最后如果在未输入的列上有空位置,则该位置就可以放置第八个皇后,否则不能放置。

【评分标准】

该题要求输出最后一个皇后放置的位置,提交程序文件名为queens.c。

【代码】

#include<stdio.h>

int main()
{
    int a[8] = {0};
    int b[8][8];
    int j,v;
    for(j = 0;j < 8;j++)
        for(v = 0;v < 8;v++)
        {
            b[j][v] = 0;
        }
    
    int num = 0;
    int m = 0;
    int k = 0;
    int i = 0;
    while(i < 8)
    {
        k = getchar();
        if(k == 42)
        {
            num = i; 
        }
        else
        {
            k -= 49;
            b[k][i] = 1;
            a[k] += 1;
        }
        i++;    
    
    }   
    
    for(i = 0;i < 8;i++)
    {
        if(a[i] == 0)
        {
            m = i;
        }
    }
    
    for(i = 0;i < 8;i++)
    {
        if(m + i < 7 && num + i <  7)
        {
            if(b[m + i][num + i] == 1)
            {
                printf("No Answer");
                return 0;
            }
        }
        if(m - i >= 0 && num + i <  7)
        {
            if(b[m - i][num + i] == 1)
            {
                printf("No Answer");
                return 0;
            }
        }
        if(m - i >= 0 && num - i >= 0)
        {
            if(b[m - i][num - i] == 1)
            {
                printf("No Answer");
                return 0;
            }
        }
        if(m + i < 7 && num - i >= 0)
        {
            if(b[m + i][num - i] == 1)
            {
                printf("No Answer");
                return 0;
            }
        }
    }
    printf("%d",m+1);
    return 0;
}


PS:由于当时刚学C语言,很多代码显得很稚嫩...需要的人见谅...
上一篇 下一篇

猜你喜欢

热点阅读