2020-11-18 N皇后問題
總結:越是因底層知識而出現的bug,越是不容易被發現
//N皇后問題
//以及出現的嚴重問題(bug)(找了半天@.@):27行程式碼 關於int/int的結果會被截斷的問題
//以下在程式碼行加的註釋是為了利用這些程式碼進行測試
#include<iostream>
using namespace std;
void Print_ChessBoard(int** chessboard,int n)//列印棋盤
{
cout<<"-----------"<<endl;
for(int i=0;i!=n;i++){
for(int j=0;j!=n;j++)
cout<<chessboard[i][j]<<" ";
cout<<endl;
}
cout<<"-----------"<<endl;
}
bool SetIs_OK(int** chessboard,int n,int i,int j)//若座標(i,j)位置可以放置(即放置後不衝突),返回true;
//之前的行下標為0~i-1的棋子已經不相互攻擊,只需滿足座標為(i,j)的棋子與行下標為0~i-1的棋子不相互攻擊即可
{
for(int i1=0;i1!=i;i1++){
int j1;
for(j1=0;j1!=n;j1++){
if(chessboard[i1][j1]==1)
break;
}//迴圈結束後找到行下標為i1的chessboard為1的座標點
if(j1==j||1.0*(j1-j)/(i1-i)==1||1.0*(j1-j)/(i1-i)==-1)//若互相攻擊,返回false
//bug※:(j1-j)/(i1-i) 分子、分母均為int,結果會被截斷 eg:4/3返回的結果是1 但這並非你需要的
//解決方法:乘以1.0,將==左邊變為double型
return false;
}
return true;
}
int sum=0;
void Trail_ChessBoard(int i,int** chessboard,int n)//前i-1行已被處理,現處理第i行
{
// cout<<"11111111111111"<<endl;
// Print_ChessBoard(chessboard,n);
// cout<<"11111111111111"<<endl;
int j;
if(i>n){Print_ChessBoard(chessboard,n); sum++;}
else{
for(j=0;j!=n;j++){
if(SetIs_OK(chessboard,n,i-1,j)){
// cout<<"成功進入遞迴一次\n";
chessboard[i-1][j]=1;
// cout<<chessboard[i-1][j]<<endl;
Trail_ChessBoard(i+1,chessboard,n);
// cout<<"出一個遞迴\n";
// cout<<chessboard[i-1][j]<<endl;
chessboard[i-1][j]=0;
}
}
}
}
int main()
{
int n;
cout<<"輸入棋盤的行列數:";
cin>>n;
int** chessboard=new int*[n];
for(int i=0;i!=n;i++)
chessboard[i]=new int[n];
for(int i=0;i!=n;i++){
for(int j=0;j!=n;j++)
chessboard[i][j]=0;
}
Trail_ChessBoard(1,chessboard,n);
cout<<"sum="<<sum<<endl;
return 0;
}
輸入棋盤的行列數:5
-----------
1 0 0 0 0
0 0 1 0 0
0 0 0 0 1
0 1 0 0 0
0 0 0 1 0
-----------
-----------
1 0 0 0 0
0 0 0 1 0
0 1 0 0 0
0 0 0 0 1
0 0 1 0 0
-----------
-----------
0 1 0 0 0
0 0 0 1 0
1 0 0 0 0
0 0 1 0 0
0 0 0 0 1
-----------
-----------
0 1 0 0 0
0 0 0 0 1
0 0 1 0 0
1 0 0 0 0
0 0 0 1 0
-----------
-----------
0 0 1 0 0
1 0 0 0 0
0 0 0 1 0
0 1 0 0 0
0 0 0 0 1
-----------
-----------
0 0 1 0 0
0 0 0 0 1
0 1 0 0 0
0 0 0 1 0
1 0 0 0 0
-----------
-----------
0 0 0 1 0
1 0 0 0 0
0 0 1 0 0
0 0 0 0 1
0 1 0 0 0
-----------
-----------
0 0 0 1 0
0 1 0 0 0
0 0 0 0 1
0 0 1 0 0
1 0 0 0 0
-----------
-----------
0 0 0 0 1
0 1 0 0 0
0 0 0 1 0
1 0 0 0 0
0 0 1 0 0
-----------
-----------
0 0 0 0 1
0 0 1 0 0
1 0 0 0 0
0 0 0 1 0
0 1 0 0 0
-----------
sum=10
Process returned 0 (0x0) execution time : 0.776 s
Press any key to continue.
相關文章
- N皇后問題
- 7-22 n queens (10分) 八皇后(n皇后)問題
- HDU - 2553 N皇后問題(DFS)
- N皇后問題(各種優化)優化
- N皇后和N皇后2
- 回溯法(排列樹)解決八(N)皇后問題
- N 皇后
- n皇后問題--回溯法,以DFS的方式搜尋
- leetcode演算法題解(Java版)-9-N皇后問題LeetCode演算法Java
- 51,N皇后
- Leetcode每日一題:52.N-Queens II(N皇后Ⅱ)LeetCode每日一題
- 20241201: 51. N 皇后
- 藍橋杯-N皇后
- 52. N皇后 II
- 洛谷八皇后問題
- 八皇后問題python解法Python
- LeetCode 52. N皇后 IILeetCode
- 演算法:N皇后二演算法
- 八皇后問題分析和實現
- Leetcode 通過率最高的困難題 N皇后 II 【回溯解法-剪枝】LeetCode
- 從八皇后問題到回溯演算法演算法
- 演算法學習回顧-皇后問題演算法
- 八皇后問題的錯誤程式碼示範
- 每日一題之拉低通過率 回溯演算法 leetcode 51 N皇后每日一題演算法LeetCode
- [20210626]find -mtime +N N -N時間問題補充.txt
- [20210625]find -mtime +N N -N時間問題補充.txt
- [20210624]find -mtime +N N -N的時間範圍問題.txt
- [Hdfs] lc52. N皇后 II(dfs方案數+經典)
- Mybatis N+1問題解析MyBatis
- 2020-11-18
- P10871 皇后 Kraljice 題解
- 連結串列-3n+1數列問題
- YCOJN皇后
- 回溯演算法 | 追憶那些年曾難倒我們的八皇后問題演算法
- 資料結構和演算法——遞迴-八皇后問題(回溯演算法)資料結構演算法遞迴
- 3. 工作分配問題(回溯法)設有n件工作分配給n個人。。。
- 記錄 2020-11-18 23點
- 【一天一大 lee】N皇后 II (難度:困難) - Day20201017