グリフンの指揮官 2019-08-20 18:48 采纳率: 0%
浏览 236

八皇后代码debug求助。

今天尝试写了下八皇后的代码,但是运行的时候发现无法跳出递归。
疯狂输出第一组解法。查了半天无果。还请大佬们给代码看看病,
诊断诊断。下面贴出代码。
(对于代码中的棋盘数组vist[i][j]+1=1的解释是,某个格子可能被多个棋子影响,拿掉其中一个棋子后格子可能还在其他棋子的影响下不能放置,所以采用的是+-1的方式表示影响该格子的棋子数,如果vist[i][j]大于0则必然不能放置。)

#include<stdio.h>
int ans[9] = { 0 }, vist[10][10] = {0};//vist数组模棋盘,ans表示每列能放下棋子的行坐标
void solve_queen(int x);//用来遍历可能结果的函数
void _vist(int m,int n);
void _clear(int m1,int n1);
int main(void)
{
    printf("This program will solve the 8 queen problem\n.Button the Enter to Solve it\n");
    getchar();
    solve_queen(1);
    getchar();
    getchar();
    return 0;
}
void _vist(int m,int n)
{
    int i1=1, j1=1;
    vist[m][n]+=1;//放下棋子的那一格数值+1表示遍历过
    while (n + j1 <= 8)//与该棋子同行的不能再放
    {
        vist[m][n + j1] += 1;
        j1+=1;
    }
    j1 = 1;
    while ((m + i1 <= 8) && (n + j1 <= 8))//与该棋子在斜向下45°方向的位置都不能放
    {
        vist[m + i1][n + j1]+= 1;
        i1+=1, j1+=1;
    }
    i1 = j1 = 1;
    while ((n + j1 <= 8) && (m - i1 >= 1))//与该棋子在斜向上45°方向的位置都不能放
    {
        vist[m - i1][n + j1] += 1;
        i1+=1, j1+=1;
    }
}
void _clear(int m1,int n1)//用于回溯时,清除拿回的那颗棋子对棋盘放置区域的影响。
{
    int i2 = 1, j2 = 1;
    vist[m1][n1] = 0;
    while (n1 + j2 <= 8)
    {
        vist[m1][n1 + j2] -= 1;
        j2+=1;
    }
    j2 = 1;
    while ((m1 + i2 <= 8) && (n1 + j2 <= 8))
    {
        vist[m1 + i2][n1 + j2] -= 1;
        i2+=1, j2+=1;
    }
    i2 = j2 = 1;
    while ((n1 + j2 <= 8) && (m1 - i2 >= 1))
    {
        vist[m1 - i2][n1 + j2] -= 1;
        i2+=1, j2+=1;
    }
}
void solve_queen(int x)
{
    int i;
    if (x > 8)
    {
        for (i=1;i<= 8;i++)
            printf("%d ", ans[i]);
        printf("\n");
    }
    for (i = 1;i <= 8;i++)
    {
        if (!vist[i][x])
        {
            ans[x] = i;
            _vist(i, x);
            solve_queen(x + 1);
            _clear(i, x);
        }
    } 
}
  • 写回答

2条回答 默认 最新

  • zqbnqsdsmd 2019-08-21 15:13
    关注
    评论

报告相同问题?

悬赏问题

  • ¥15 Java中消息和缓存如何使用
  • ¥50 易语言把MYSQL数据库中的数据添加至组合框
  • ¥20 求数据集和代码#有偿答复
  • ¥15 关于下拉菜单选项关联的问题
  • ¥20 java-OJ-健康体检
  • ¥15 rs485的上拉下拉,不会对a-b<-200mv有影响吗,就是接受时,对判断逻辑0有影响吗
  • ¥15 使用phpstudy在云服务器上搭建个人网站
  • ¥15 应该如何判断含间隙的曲柄摇杆机构,轴与轴承是否发生了碰撞?
  • ¥15 vue3+express部署到nginx
  • ¥20 搭建pt1000三线制高精度测温电路