注册 登录
编程论坛 数据结构与算法

八皇后 循环实现

来生再见 发布于 2015-11-27 22:19, 2021 次点击
程序代码:


#include <stdio.h>
#define N 8

char board2[N + 2][N + 2];
int QueenPos2[N];
int count2 = 0;
//定义一个方向的结构体
typedef struct _Tag_Pos
{
    int xpos;
    int ypos;
}Pos2;

Pos2 pos2[3] = { { -1, -1 }, { -1, 0 }, { -1, 1 } };

void init2(void);
void display2(void);
int check2(int x, int y);
void find2(void);

int main(int argc, char *argv[])
{
    init2();
    find2();
    return 0;
}
//初始化
void init2(void)
{
    for (int i = 0; i < N;i++)
    {
        QueenPos2[i] = 1;
    }
    for (int i = 0; i < N + 2; i++)
    {
        for (int j = 0; j < N + 2; j++)
        {
            if ((i == 0) || (i == N + 1))
            {
                board2[i][j] = '#';
            }
            else if ((j == 0) || (j == N + 1))
            {
                board2[i][j] = '#';
            }
            else
            {
                board2[i][j] = ' ';
            }
        }
    }
}

//输出
void display2(void)
{
    for (int i = 0; i < N + 2; i++)
    {
        for (int j = 0; j < N + 2; j++)
        {
            printf("%c", board2[i][j]);
        }
        printf("\n");
    }
}
//检测某个位置是不是可以放置皇后
int check2(int i, int j)
{
    int ret = 1;
    for (int p = 0; p < 3; p++)
    {
        int ni = i;
        int nj = j;

        while (ret && (board2[ni][nj] != '#'))
        {
            ni = ni + pos2[p].xpos;
            nj = nj + pos2[p].ypos;

            ret = ret && (board2[ni][nj] != '*');
        }
    }

    return ret;
}

//找出所有的皇后
void find2(void)
{
    //
    for (int i = 1; i <= N;)
    {
        int flag = 1;
        for (int j = QueenPos2[i]; j <= N;j++)
        {
            //检测一下可不可以安置一个皇后
            if (check2(i,j))
            {
                QueenPos2[i] = j;
                board2[i][j] = '*';
                flag = 0;
                break;
            }
        }
        //如果flag==1?表示没找到,否则找到
        if (flag)
        {
            i--;
            board2[i][QueenPos2[i]] = ' ';
            QueenPos2[i]++;
        }
        else
        {
            i++;
        }
        getchar();
    }
    display2();
}


帮忙看一下怎么回事啊,我没有使用递归来实现,使用了循环来实现,但是就是得不到结果
2 回复
#2
azzbcc2015-11-30 09:59
程序代码:
//如果flag==1?表示没找到,否则找到
if (flag)
{
    QueenPos2[i] = 1;
    i--;
    board2[i][QueenPos2[i]] = ' ';
    QueenPos2[i]++;
}
else
{
    i++;
}
//getchar();


另外你的QueenPos2越界了
#3
来生再见2015-11-30 19:18
回复 2楼 azzbcc
终于有人会我帖子了,谢谢啊
1