浙江中醫藥大學程序設計代表隊2018年訓練賽十三

Problem B: 棋盤多項式

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 9  Solved: 6
[Submit][Status][Web Board]

Description

八皇后問題是在棋 盤上放皇后,互相不攻擊,求方案。變換一下棋子,還可以有八車問題,八馬問題,八兵問題,八王問題,注意別念反。在這道題裏,棋子換成車,同時棋盤也得 換,確切說,是進行一些改造。比如現在有一張n*n的棋盤,我們在一些格子上摳幾個洞,這些洞自然不能放棋子了,會漏下去的。另外,一個車本來能攻擊和它 的同行同列。現在,你想想,在攻擊的過程中如果踩到一個洞,便會自取滅亡。故,車的攻擊範圍止於洞。
此題,給你棋盤的規模n,以及挖洞情況,求放k個車的方案數(k從0到最多可放車數)

Input

 第一行一個整數n表示棋盤大小
接下來n行,每行n個用空格隔開的數字0或1,0的形狀表示洞,1表示沒有洞

n<=8

Output

 若干行,第i行表示放i個車的方案數

Sample Input

3
1 0 1
1 1 1
1 0 1

Sample Output

7
12
4


【分析】

八皇后的.....略微修改版...並沒有什麼實質性的難度加深....注意細節吧

【代碼】

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
 
const int MAXN = 200;
const int INF = 1e9 + 7;
 
int n,a[MAXN][MAXN],f[MAXN],c[MAXN][MAXN];
 
bool judge(int x,int y) {
    if(a[x][y] == 0) return false;
    int i = x-1,j = y-1;
    while(i>=0 && a[i][y] == 1) {
        if(c[i][y] == 1) return false;
        i--;
    }
    while(j>=0 && a[x][j] == 1) {
        if(c[x][j] == 1) return false;
        j--;
    }
    i = x+1;
    while(i<n && a[i][y] == 1) {
        if(c[i][y] == 1) return false;
        i++;
    } 
    j = y+1;
    while(j<n && a[x][j] == 1) {
        if(c[x][j] == 1) return false;
        j++;
    }
    return true;
}
 
void dfs(int x,int y,int d) {
    f[d]++;
    for(int i=y+1; i<n; i++) {
        if(judge(x,i)) {
            c[x][i] = 1;
            dfs(x,i,d+1);
            c[x][i] = 0;
        }
    }
    for(int i=x+1; i<n; i++) {
        for(int j=0; j<n; j++) {
            if(judge(i,j)) {
                c[i][j] = 1;
                dfs(i,j,d+1);
                c[i][j] = 0;
            }
        }
    }
}
 
int main() {
#ifndef ONLINE_JUDGE
    freopen("input.txt","r",stdin);  
#endif
    while(cin >> n) {
        memset(f,0,sizeof(f));
        memset(c,0,sizeof(c));
        for(int i=0; i<n; i++)
            for(int j=0; j<n; j++)
                cin >> a[i][j];
        for(int i=0; i<n; i++) {
            for(int j=0; j<n; j++) {
                if(a[i][j] == 0) continue;
                c[i][j] = 1;
                dfs(i,j,1);
                c[i][j] = 0;
            }
        }
        for(int i=1; ; i++){
            if(f[i] == 0) break;
            cout << f[i] << endl;
        }
    }
    return 0;
}

發佈了294 篇原創文章 · 獲贊 155 · 訪問量 54萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章