美文网首页
【C/C++】八皇后问题

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

作者: 仍有不归期 | 来源:发表于2020-06-05 12:19 被阅读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语言,很多代码显得很稚嫩...需要的人见谅...

相关文章

  • C++八皇后问题

    八皇后问题是由国际西洋棋棋手马克斯·贝瑟尔于1848年提出的问题,是回溯算法的典型案例。 问题表述为:在8×8格的...

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

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

  • 八皇后算法游戏

    C++八皇后算法游戏,关于八皇后问题的提出:八皇后是个古老而有趣的游戏,是由高斯于1850年首先提出的。要求在国际...

  • ostream和ofstream的对比

    最近复习了一下八皇后问题,发现C++和Java的运行效果不一样.Java瞬间就完成了打印,而C++的打印过程持续了...

  • 八皇后问题(Eight queens puzzle) C++方式

    八皇后问题 皇后:国际象棋中威力最强的一颗棋子,走法是横、直、斜走均可,格数不限,不可越子 国际象棋:在8*8的方...

  • 八皇后和约瑟夫问题

    今天在写C语言报告的时候,收获了两种算法的实现,分别是八皇后和约瑟夫问题。 八皇后:总的来说,八皇后问题就是一种b...

  • 八皇后问题c语言算法

    目录[TOC] 问题分析: 相信八皇后规则的问题,大家都很熟悉,接下来是如何分析回溯法的应用。回溯法与图里面的深度...

  • 2019-02-23 N皇后算法

    C++实现N皇后问题 程序中一开始通过设置sizeOfBoard规定方形棋盘的大小 程序使用了vector类创建了...

  • 11.数据结构—八皇后问题(回溯法)

    11.1 八皇后问题 八皇后问题是以国际象棋为背景的问题:有八个皇后(可以当成八个棋子),如何在 88 的棋盘中放...

  • 基于C++实现的N皇后问题

    一、使用说明 1.1 项目简介 八皇后问题是一个古老而著名的问题,是回溯算法的经典问题。该问题是十九世纪著名的数学...

网友评论

      本文标题:【C/C++】八皇后问题

      本文链接:https://www.haomeiwen.com/subject/bfbpzhtx.html