您的位置:首页 > 其它

八皇后问题

2017-12-11 21:49 176 查看
#include <stdio.h>

#include <stdlib.h>

void _trail(int dimention, int n);

void _printChessboard(int arr[8][8], int dimention);

int _isValid(int i, int j, int diamention);

void _clear(int dimention, int row); //清除指定行以下的元素

void _clearRow(int row, int col); //清除指定行的指定列之前的元素

int chessboard[8][8] = {

0,0,0,0,0,0,0,0,

0,0,0,0,0,0,0,0,

0,0,0,0,0,0,0,0,

0,0,0,0,0,0,0,0,

0,0,0,0,0,0,0,0,

0,0,0,0,0,0,0,0,

0,0,0,0,0,0,0,0,

0,0,0,0,0,0,0,0

};

int main(int argc, char *argv[]) {

_trail(8, 0);

getchar();

}

void _trail(int dimention, int n) {

if (n >= dimention)

_printChessboard(chessboard, 8);

_clear(dimention,n);

for (int i = 0; i < dimention; i++) {

_clearRow(n, i);

_clear(dimention, n + 1);

chessboard
[i] = 1;

if (_isValid(n, i, dimention))

_trail(dimention, n + 1);

}

}

void _printChessboard(int arr[8][8], int dimention) {

for (int i = 0; i < dimention; i++) {

for (int j = 0; j < dimention; j++)

printf("%d ", arr[i][j]);

putchar(10);

}

putchar(10);

return;

}

int _isValid(int i, int j, int dimention) {

int sum_Row = 0;

int sum_Column = 0;

int sum_MDiagonal = 0; //主对角线元素之和

int sum_SDiagonal = 0; //副对角线元素之和

for (int k = 0; k < 8; ++k) {

sum_Row += chessboard[i][k];

sum_Column += chessboard[k][j];

}

if (sum_Row != 1 || sum_Column != 1)

return 0; //判断横纵反向是否满足

for (int m = 0; m < dimention; ++m) {

int mainElem_rowNum = i + (m - j);

int mainElem_columnNum = m;

int sideElem_rowNum = i + (j - m);

int sideElem_columnNum = m;

if (mainElem_rowNum >= 0 && mainElem_rowNum < dimention)

sum_MDiagonal += chessboard[mainElem_rowNum][mainElem_columnNum];

if (sideElem_rowNum >= 0 && sideElem_rowNum < dimention)

sum_SDiagonal += chessboard[sideElem_rowNum][sideElem_columnNum];

}

if (sum_MDiagonal != 1 || sum_SDiagonal != 1)

return 0; //判断对角反向是否满足

return 1;

}

void _clear(int dimention, int row) {

for (int i = row; i < dimention; ++i)

for (int j = 0; j < dimention; ++j)

chessboard[i][j] = 0;

}

void _clearRow(int row, int col) {

for (int i = 0; i < col; ++i)

chessboard[row][i] = 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: