1. 程式人生 > >八皇後問題(DFS)

八皇後問題(DFS)

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){//
DFS 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; }
View Code

八皇後問題(DFS)