码迷,mamicode.com
首页 > 其他好文 > 详细

八皇后问题

时间:2015-02-13 23:35:39      阅读:260      评论:0      收藏:0      [点我收藏+]

标签:

八皇后问题

八皇后问题


#include <cstdio>

const int N = 8;
int count;

int notdanger(int row, int c, int (*chess)[N]) {
// i 和 j 是 行列下标,一直扫

    // 
    for (int i = 0; i < N; i++) {
        if (chess[i][c] != 0) {
            return 0;
        }
    }

    // 左上方
    for (int i = row, j = c; i >= 0 && j >= 0; i--, j--) {
        if (chess[i][j] != 0) {
            return 0;
        }
    }

    // 右下方
    for (int i = row, j = c; i < N && j < N; i++, j++) {
        if (chess[i][j] != 0) {
            return 0;
        }
    }

    // 右上方
    for (int i = row, j = c; i >= 0 && j < N; i--, j++) {
        if (chess[i][j] != 0) {
            return 0;
        }
    }

    // 左下方
    for (int i = row, j = c; i < N && j >= 0; i++, j--) {
        if (chess[i][j] != 0) {
            return 0;
        }
    }

    return 1;
}

void eight_queue(int row, int c, int (*chess)[N]) {
    int chess2[N][N];           // 用于打印

    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            chess2[i][j] = chess[i][j];
        }
    }

    if (row == N) {
        printf("%d\n", ++count);  // 计算有 X 种方法
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < N; j++) {
                printf("%d ", chess2[i][j]);
            }
            printf("\n");
        }
        printf("\n\n");

    } else {                    // 判断是否安全
        for (int i = 0; i < c; i++) {
            if ( notdanger(row, i, chess)) {  // 不危险
                for (int j = 0; j < N; j++) { // 因为这列以前被赋值过
                    chess2[row][j] = 0;
                }
                chess2[row][i] = 1;
                eight_queue(row+1, c, chess2);
            }
        }
    }

}

int main(void) {
    int chess[N][N];
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            chess[i][j] = 0;
        }
    }

    eight_queue(0, N, chess);

    return 0;
}

八皇后问题

标签:

原文地址:http://www.cnblogs.com/sunznx/p/4291001.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!