【題解】 狀態壓縮 CSYZOJ 1040 || codevs 1295 || hdu 2553 N皇后問題

hdu2553需要記憶化答案

就當我是來水博客的吧

不過確實跟我要講的狀壓dp有關啊

當然不用在意CSYZOJ
只是對於YZOJ評測機卡我不爽


題目

題目描述

在N*N的棋盤上放置N個皇后(n<=10)而彼此不受攻擊(即在棋盤的任一行,任一列和任一對角線上不能放置2個皇后),編程求解所有的擺放方法。

輸入

一個數,N。

輸出

每行輸出一種方案,每種方案順序輸出皇后所在的列號,各個數之間有空格隔開。若無方案,則輸出:”no solute!”

樣例輸入

4

樣例輸出

2 4 1 3
3 1 4 2

提示

1 <= N <= 8


題解

當然是每一行枚舉列
壓縮掉所放的列,和左右兩個方向的對角線
畫個圖來觀察第幾條對角線和位置的關係即可處理對角線的表示


代碼

#include <cstdio>

const int maxn = 10;
int n, res[maxn];
bool flag = false;
void dfs(int th, int col, int ri, int le){//column right left
    if (th > n){
        for (int i = 1; i <= n; ++i) printf ("%d ", res[i]);
        printf ("\n"); return ;
        flag = true;
    }
    int rit = th - 1, let = n - th;
    for (int i = 1, j; i <= n; ++i){
        if (!((col & (1 << i)) | (ri & (1 << rit + i)) | (le & (1 << let + i)))){
            res[th] = i;
            dfs(th + 1, col | (1 << i), ri | (1 << rit + i), le | (1 << let + i));
        }
    }
}
int main (){
    scanf ("%d", &n); dfs(1, 0, 0, 0);
    if (!flag) printf ("no solute!");

    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章