1. 程式人生 > >[遞迴] 八皇后問題 - C語言

[遞迴] 八皇后問題 - C語言

#include<stdio.h>

int count=0;//統計一共有幾種

int notDanger(int row,int j,int (*chess)[8]) {
	int i,k,flag1=0,flag2=0,flag3=0,flag4=0,flag5=0;
	//判斷豎方向
	for (i=0; i<8; i++) {
		if ( chess[i][j] !=0 ) {
			flag1 = 1;
			break;
		}
	}
	//判斷左上方
	for (i=row,k=j; i>=0&&k>=0; i--,k--) {
		if (chess[
i][k]!=0) { flag2 = 1; break; } } //判斷右下方 for (i=row,k=j; i<8&&k<8; i++,k++) { if (chess[i][k]!=0) { flag3 = 1; break; } } //判斷右上方 for (i=row,k=j; i>=0&&k<8; i--,k++) { if (chess[i][k]!=0) { flag4 = 1; break; } } //左下方 for (i=row,k=j; i<8&&
k>0; i++,k--) { if (chess[i][k]!=0) { flag5 = 1; break; } } if (flag1 || flag2 || flag3 ||flag4 ||flag5) return 0; else return 1; } //row起始行 n列數 (*chess)[8]指向棋盤每一行的指標 void eightQueen(int row,int n,int (*chess)[8] ) { int chess2[8][8],i,j; for (i=0; i<8; i++) { for (j=0; j<8
; j++) { chess2[i][j]=chess[i][j]; } } if (8 == row) { printf("第%d種\n",++count); for (i=0; i<8; i++) { for (j=0; j<8; j++) { printf("%d",chess2[i][j]); } printf("\n"); } printf("\n"); } else { //判斷這個位置是否有危險 //如果沒有危險,繼續往下 for (j=0; j<n; j++) { if (notDanger(row,j,chess)) {//判斷是否危險 for(i=0; i<8; i++) { *(*(chess2+row)+i)=0; } *(*(chess2+row)+j)=1; eightQueen(row+1,n,chess2); } } } } int main() { int chess[8][8],i,j; for (i=0; i<8; i++) { for (j=0; j<8; j++) { chess[i][j]=0; } } eightQueen(0,8,chess); printf("總共有解決方法%d",count); return 0; }