c语言-C++中的八皇后问题,编译通过了,但执行的时候为什么直接显示按任意键返回

问题描述

C++中的八皇后问题,编译通过了,但执行的时候为什么直接显示按任意键返回

#include//8*8的棋盘
#define max 8
int i,j;
int e,s;
char queen[max][max];

int main()
{
void fz();
void put();
void check();
void show();
void checkandput();
void checkagain();
for(i=0;i<max;i++)
for(j=0;j<max;j++)
queen[i][j]='a';

checkandput();//开始运算

return 0;

}

void fz()//将位置上的值赋为Q
{
queen[i][j]='Q';

}

void show()//打印当前的棋盘棋盘
{
int m,n;
for(m=0;m<max;m++)
{
for(n=0;n<max;n++)
printf(" %c ",queen[m][n]);
printf("n");

}
printf("n");

}

void put()//判断按照那种方式进行回溯
{
void fz();
void check();
void checkagain();
s=0;
if(e==0 && i!=8 && j<=8)
s=1;
else if(e==1 && j<8 && i!=8)//不符合调节是在下一列找
{
j++;
check();

    }
    else if(e==1 && j==8 && i!=8)//回溯到上一行
    {
        i--;
        checkagain();
    }
    else if(i==8 && e==0 && j<8)//当到最后一行并且放下了棋子的时候,先将该位置赋值,在打印棋盘,最后看下一个位置是否符合
    {
        fz();
        show();
        queen[i][j]=' ';
        j++;
        check();

    }
    else if(i==8 && e==0 && j==8)
    {
        fz();
        show();
        queen[i][j]=' ';
        i--;
        checkagain();

    }
    else if(i==8 && e==1 && j<8)
    {
        j++;
        check();

    }
    else if(i==8 && e==1 && j==8)
    {
        i--;
        checkagain();

    }

}

void checkandput()//检查是否能打印
{
void check();
for(i=0;i<max;i++)
{
j=0;
check();
if(s==1)
fz();
}

}

void check()//判断是否符合条件能不能放下棋子
{
int m,n;
void put();
e=0;
for(m=0;m<max;m++)//判断正斜行
for(n=0;n<max;n++)
if((i-j)==(m-n) && queen[m][n]=='Q')
{

                e=1;
                break;

        }
    for(m=0;m<max;m++)//判断负斜行
        for(n=0;n<max;n++)
            if((n+m)==(i+j) && queen[m][n]=='Q')
            {

              e=1;
              break;
            }

    for(m=0;m<max;m++)//判断一列
        if(queen[m][j]=='Q')
        {

            e=1;
            break;
        }

    for(n=0;n<max;n++)//判断一行
        if(queen[i][n]=='Q')
        {

            e=1;
            break;

        }
    put();

}

void checkagain()//当在一行中都没有可以放棋子的位置的时候,就回溯到上一列去寻找下一个可以放棋子的位置
{
void check();
e=0;
for(j=0;j<max;j++)
if(queen[i][j]=='Q')
{
queen[i][j]==' ';
j++;
break;
}
check();

}

解决方案

没耐心看代码,执行没反应,那就是语法正确,逻辑错误咯,大脑中的思路又先入为主,以
为代码是按照自己的意思来运行,实际上却有偏差,自己好好找找

解决方案二:

参考代码
https://github.com/707wk/Practice-Code-For-CPP/blob/master/20150326001.c

时间: 2024-10-29 20:11:12

c语言-C++中的八皇后问题,编译通过了,但执行的时候为什么直接显示按任意键返回的相关文章

C++实现八皇后问题的方法_C 语言

本文实例展示了C++实现八皇后问题的方法,是数据结构与算法中非常经典的一个算法.分享给大家供大家参考之用.具体方法如下: 一般在八皇后问题中,我们要求解的是一个8*8的国际象棋棋盘中,放下8个皇后且互相不能攻击的排列总数.皇后的攻击范围为整行,整列,以及其斜对角线. 由于皇后的攻击范围特性,注定我们每行只能放下一个皇后,于是我们要做的只是逐行放下皇后.八皇后问题是回溯法的典型问题.这里我们用的方法很简单: 从第一行开始逐个检索安全位置摆放皇后,一旦有安全位置则考虑下一行的安全位置.如果发现某行没

python 八皇后中的列表问题

问题描述 python 八皇后中的列表问题 我这里写了一个简单的八皇后程序,用的是最笨的算法,大家就不要吐槽我的算法了,问题是我的保存所有解法的总列表不正常,列表中所有元素都一样,劳烦大家看下问题出在哪 import time import os def check(list_): #这个函数用来检查当前位置是否合法 for i in range(0,len(list_)-1): if len(list_)==1 : continue for j in range(i+1,len(list_))

c语言-八皇后问题在线等解答

问题描述 八皇后问题在线等解答 #include #include int place(int k,int x[]) { int i=0; for(i=1;i if(fabs(k-i)==fabs(x[i]-x[k])||x[i]==x[k])return 0; return 1; } void backstrack(int t,int n,int x[],int *sum) { int i; if(t>n)(*sum)++; else for(i=1;i<=n;i++) { x[t]=i;

UVa 639:Don&#039;t Get Rooked, 类八皇后问题

题目链接: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=108&page=show_problem&problem=580 题目类型: 暴力, 回溯法 题目: In chess, the rook is a piece that can move any number of squares vertically or horizontally. In this p

C#用递归算法解决八皇后问题_C#教程

1.引子 中国有一句古话,叫做"不撞南墙不回头",生动的说明了一个人的固执,有点贬义,但是在软件编程中,这种思路确是一种解决问题最简单的算法,它通过一种类似于蛮干的思路,一步一步地往前走,每走一步都更靠近目标结果一些,直到遇到障碍物,我们才考虑往回走.然后再继续尝试向前.通过这样的波浪式前进方法,最终达到目的地.当然整个过程需要很多往返,这样的前进方式,效率比较低下. 2.适用范围 适用于那些不存在简明的数学模型以阐明问题的本质,或者存在数学模型,但是难于实现的问题. 3.应用场景 在

【算法导论】八皇后问题的算法实现(C、MATLAB、Python版)

        八皇后问题是一道经典的回溯问题.问题描述如下:皇后可以在横.竖.斜线上不限步数地吃掉其他棋子.如何将8个皇后放在棋盘上(有8*8个方格),使它们谁也不能被吃掉?         看到这个问题,最容易想到的就是遍历穷举法,不过仔细一想,思路虽然非常清晰,但是需要遍历次数太多,时间复杂度很高.那么,我们应该怎么办呢?下面给出算法思路:         算法思想:首先尝试在第一行放置第一个皇后,然后在第二行放置第二个使之与前面的皇后不构成威胁,依此类推.如果发现不能放置下一个皇后,就回

八皇后问题的C#解答

解答|问题 改编自V星[视窗王子]应答程序,如下:<br><br>using System;<br>class Queen{<br>    const int SIZE = 8;//皇后数<br>    public static void Main()<br>    {<br>        int[] Queen = new int [SIZE];//每行皇后的位置<br>        int y,x,i

UVa 167:The Sultan&#039;s Successors, 八皇后问题

题目链接: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=108&page=show_problem&problem=103 题目类型: 回溯 原题: The Sultan of Nubia has no children, so she has decided that the country will be split into up to k separate

基于Delphi的八皇后问题动态实现

摘要 对于八皇后问题的实现,如果结合动态的图形演示,则可以使算法的描述更形象.更生动,使教学能产生良好的效果. 关键词 八皇后问题 冲突 数据结构 线程类 八皇后问题是一个古老而著名的问题,是回溯算法的典型例题.该问题是十九世纪著名的数学家高斯1850年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法. 下面用delphi6实现的八皇后问题的动态图形程序,能够演示全部的92组解.八皇后问题动态图形的实现,主要应解决以下