iT邦幫忙

DAY 22
0

重頭打基礎-C/C++系列 第 22

重頭打基礎-C/C (Day22:八皇后)

  • 分享至 

  • xImage
  •  

問題:

有一個8*8格的棋盤,要在上面放八個皇后而不能互相攻擊到彼此

如下圖一個皇后放下去之後紅線上的格子不能再放皇后

解法:

用遞迴

分成兩個子問題
(1)在任意位置放一個皇后
(2)在攻擊範圍外放另一個皇后

一行一行的看(因為一行頂多放一個

程式碼:

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(*(*(chess2+i)+j) !=0){

flag1 =1;

break;

}

}

//判斷左上方

for(i =row,k=j;i>=0&&k>=0;i--,k--){

if(*(*(chess2+i)+j) !=0){

flag2 =1;

break;

}

}

//判斷右下方

for(i =row,k=j;i<8&&k<8;i++,k++){

if(*(*(chess2+i)+j) !=0){

flag3 =1;

break;

}

}

//判斷右上方

for(i =row,k=j;i>=0&&k<8;i--,k++){

if(*(*(chess2+i)+j) !=0){

flag4 =1;

break;

}

}

//判斷左下方

for(i =row,k=j;i<8&&k>=0;i++,k--){

if(*(*(chess2+i)+j) !=0){

flag5 =1;

break;

}

}

if(flag||flag||flag||flag||flag){

return 0;

}else{

return 1;

}

}

//row:起始行

//a:表示列

//(*chess)[8]:表示指向棋盤每一行的指針

void eightQueen(int row, int a, int (*chess)[8]){

int chess2[8][8],i,j;

for(i =0;i<8;i++)

for(i =0;i<8;i++)

chess2[i][j]=chess[i][j];

if( 8 == row){

printf("%d",count);//第N種情況,總共有92種

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<8;j++){

//是否在攻擊路線上

if(notdanger(row,j,chess)){

for(i =0;i<8;i++)

*(*(chess2+row)+j = 0;

*(*(chess2+row)+j = 1;

eightQueen(row +1, a, 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;

}


上一篇
重頭打基礎-C/C (Day21:漢諾塔、河內塔)
下一篇
重頭打基礎-C/C (Day23:Tree)
系列文
重頭打基礎-C/C++30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言