Problem B: 棋盤多項式
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 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
Sample Output
【分析】
八皇后的.....略微修改版...並沒有什麼實質性的難度加深....注意細節吧
【代碼】
#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;
}