N皇后问题

8皇后问题:

     在8×8格的国际象棋盘上摆放8个皇后,使其不能互相攻击,即任意两个皇后都

不能处于同一行、同一列或同一斜线上,问有多少种摆法?

 

通过递归来解决N皇后的问题。

设置三个数组,a[N], b[2N-1],c[2N-1],并初始化为0

a[i]为0,表示每列不冲突
b[i-j+N-1]为0,表示每主对角线不冲突
c[i+j]为0,表示每次对角线不冲突

PS:主对角线定义为从左上到右下的一条斜线.

 

源代码:

#include <stdio.h> #define N 8 #define CN (N*2-1) static char QueenArray[N][N]; static int a[N]; static int b[CN]; static int c[CN]; static int nQueenNum=0;//count of the all display of the queen void Queen(int row);// i is the row number int main() { int nRow,nColumn; for (nRow=0;nRow<N;nRow++) { a[nRow]=0; for(nColumn=0;nColumn<N;nColumn++) QueenArray[nRow][nColumn]='*'; } for(nRow=0;nRow<CN;nRow++) b[nRow] = c[nRow]=0; Queen(0); return 0; } void Queen(int row) { int nColumn; for(nColumn=0;nColumn<N;nColumn++) { if(a[nColumn]==0&&b[row-nColumn+N-1]==0&&c[row+nColumn]==0) { QueenArray[row][nColumn]='@';//Queen flag a[nColumn]=1; b[row-nColumn+N-1]=1; c[row+nColumn]=1; if (row<(N-1)) Queen(row+1); else { int nRow,nColumn; printf("The %d th state is :/n",++nQueenNum); for(nRow=0;nRow<N;nRow++) { for(nColumn=0;nColumn<N;nColumn++) printf("%c",QueenArray[nRow][nColumn]); printf("/n"); } printf("/n/n"); } //trace back and reset QueenArray[row][nColumn]='*'; a[nColumn]=0; b[row-nColumn+N-1]=0; c[row+nColumn]=0; } } }

你可能感兴趣的:(c)