八皇後問題(DFS)
阿新 • • 發佈:2018-09-05
clu 如果 borde lap std tps return 直線 code
題目描述:
要在國際象棋棋盤中放八個皇後,使任意兩個皇後都不能互相吃,皇後能吃同一行、同一列,同一對角線上(兩個方向的對角線)的任意棋子。現在給一個整數n(n<=92),輸出前n種的擺法。
輸入格式:
輸入一個整數n。
輸出格式:
輸出共n行。
每行8個數,表示每行所放的列號,每個數輸出占4列。
樣例輸入:
3
樣例輸出:
1 5 8 6 3 7 2 4
1 6 8 3 7 4 2 5 1 7 4 6 8 2 5 3
思路:DFS,把每一個格子試一次。
提示:
確定兩個棋子在不在統同一行,同一列,同一對角線的方法:
如下圖,如果兩個棋子在同一行,則i1=i2;
如果兩個棋子在同一行列,則j1=j2;
如果兩個棋子在同對角線,則i1+j1=i2+j2;
不多說了,上代碼:
#include<bits/stdc++.h> using namespace std; int a[9],b[17],c[17],d[9],n,sum,m;//a[9],b[9],直線, c[17],d[17],對角線 void print(){ for(int i=1;i<=n;i++)printf("%4d",d[i]); cout<<endl; } void search(int row){//View CodeDFS if(row>n){//如果放滿了就打印(print函數) sum++; if(sum<=m)print(); return;//返回 } for(int i=1;i<=n;i++){ if(a[i]==0 && b[row+i]==0 && c[row-i+7]==0){ a[i]=1; b[row+i]=1; c[row-i+7]=1;//放棋子 d[row]=i;//記錄 search(row+1);//遞歸 a[i]=0; b[row+i]=0; c[row-i+7]=0;//恢復 } } } int main(){ n=8;//八皇後,故n=8 cin>>m; search(1); return 0; }
八皇後問題(DFS)