演算法入門經典 第七章 例題7 2 八皇后問題

2022-09-05 20:12:14 字數 1471 閱讀 8448

原本利用回溯思想解決的經典八皇后問題,其實也是可以用遞迴解決的~

八皇后的遞迴解決思路:

從第一行開始,依次判斷0~8列的哪一列可以放置queen,這樣就確定了該行的queen的位置,然後行數遞增,繼而遞迴實現下一行的判斷,依次類推直到行數增加到8(行數從0開始的),此時為遞迴-----歸的條件,即表示一種八皇后的解決方法完成,列印結果;之後進行下一種解決方法的尋找,大致思路個人理解是這樣

nodanger(row,j,(*chess)[8])函式是判斷第row行第j列是否可以放置queen

#includeint count=0;//

引數row:起始行

//引數n:表示列數

//引數(*chess)[8]表示指向棋盤每一行的指標

int notdanger(int row,int j,int (*chess)[8])//

比較不同行同列上是否有其他皇后

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

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

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

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

}if(flag1||flag2||flag3||flag4||flag5)

else

return1;

} /*

int nodanger(int row,int j,int (*chess)[8])

} //判斷左上方

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

} //判斷右下方

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

} //判斷左下方

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

} //判斷右上方

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

} if(flag1||flag2||flag3||flag4||flag5)

else

} */

eightqueen(

int row,int n,int (*chess)[8

]) }

if(8==row)

count++;

}else

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

皇后的位置賦值為1

eightqueen(row+1,n,chess2);//

繼續往下一行 遞迴

} }

}} intmain()

eightqueen(

0,8,chess);

printf(

"總共有%d種解決方法

",count);

return0;

}

C 入門經典 第七章

本章內容 執行程式的兩種方式 除錯模式和非除錯模式。輸出視窗 包括輸出和除錯兩種模式。1.輸出除錯資訊 debug.writeline 僅在除錯模式下執行 trace.writeline 還可用於發布程式 using system using system.collections.generic u...

第七章 7 2節練習

練習7.16 在類的定義中對於訪問說明符出現的位置的次數由限定嗎?如果有是什麼?什麼樣的成員應該定義在public說明符之後,什麼樣的成員應該定義在private說明之後?解答 對次數和位置沒有嚴格的限制。簡單來說,想讓外部訪問到的成員應該定義在public之後,不想讓外部訪問的到的成員應該定義在p...

演算法導論第七章例題 快速排序

快速排序的平均意義上的時間複雜度是nlgn,最差意義上的時間複雜度是n n,演算法的好壞取決於所選取的用於劃分陣列的元素的大小。演算法的思路是 將陣列按照某個元素劃分為兩個部分,並單獨對這兩個部分陣列進行就地排序,就地排序時重複利用劃分的方法將陣列分為更小的兩部分。本 中為了使 具有平均意義上的時間...