第十九章 ALDS1_13_A:8 Queens Problem 八皇后问题

知识点

八皇后问题比较多解法,这里说的是最简单的回溯解法。

问题链接

ALDS1_13_A:8 Queens Problem

问题内容

在8*8的国际象棋棋盘里,有k个皇后已经放好了,皇后会将她的这行、这列、左右斜边上的其他棋子攻击,问如何将8个皇后放到8*8的棋盘保证她们互相不攻击。

思路

我们用递归的方式去尝试,在递归完成后若不成功,则恢复原来的状态继续尝试其他的递归。

代码

#include   
#include  
#include
#include
using namespace std;
const int maxx = 8;
// 行列、斜列
int row[maxx], col[maxx];
int dpos[maxx * 2 - 1], dneg[maxx * 2 - 1];

int x[maxx][maxx];

void init() {
    for (int i = 0; i < maxx; i++)
        row[i] = col[i] = 0;
    for (int i = 0; i < maxx * 2 - 1; i++)
        dpos[i] = dneg[i] = 0;
    for (int i = 0; i < maxx; i++)
        for (int j = 0; j < maxx; j++)
            x[i][j] = 0;
}
void print() {

    for (int i = 0; i < maxx; i++) {
        for (int j = 0; j < maxx; j++) {
            if (x[i][j] && row[i] != j)
                return;
        }
    }
    for (int i = 0; i < maxx; i++) {
        for (int j = 0; j < maxx; j++) {
            printf("%c", row[i] == j ? 'Q' : '.');
        }
        printf("\n");
    }
}
void recursive(int i) {
    if (i == maxx) {
        print();
        return;
    }

    for (int j = 0; j < maxx; j++) {
        // 不适合放在这里
        if (col[j] || dpos[i + j] || dneg[i - j + maxx - 1])
            continue;

        // 尝试放下这里
        row[i] = j; col[j] = dpos[i + j] = dneg[i - j + maxx - 1] = 1;
        recursive(i + 1);
        // 恢复刚才的操作继续其他的操作
        row[i] = col[j] = dpos[i + j] = dneg[i - j + maxx - 1] = 0;
    }
}
int main()
{
    int k;
    int r, c;
    scanf("%d", &k);
    for (int i = 0; i < k; i++){
        scanf("%d %d", &r, &c);
        x[r][c] = 1;
    }

    recursive(0);
    return 0;
}

你可能感兴趣的:(挑战程序设计竞赛2,算法和数据结构,挑战程序设计竞赛2,算法和数据结构)