题意:给一个图,X 代表障碍物,问最多放置多少个 item,使每行每列的 item 间不能相互到达。
思路:八皇后变形题,我的思路是从左到右从上到下的跑点,用 k 表示第几个点,那么这个点的坐标就能用 k 来表示。
#include<iostream>
#include<cmath>
#include<cstring>
#include<string>
#include<cstdio>
#include<algorithm>
using namespace std;
int n, ans;
int pic[10][10];
bool judge(int x, int y){ //判断该点能否放置
bool flag1 = 1, flag2 = 1;
for(int i = x-1; i >= 0; i--){
if(pic[i][y] == 1)
flag1 = 0;
if(pic[i][y] == -1)
break;
}
for(int i = y-1; i >= 0; i--){
if(pic[x][i] == 1)
flag2 = 0;
if(pic[x][i] == -1)
break;
}
return (flag1&&flag2);
}
void dfs(int k, int cnt){ //k是点序号 cnt是已放置的item个数
if(k == n*n){
ans = max(ans, cnt);
return;
}
int x = k/n;
int y = k%n;
if(judge(x, y) && pic[x][y] != -1){
pic[x][y] = 1;
dfs(k+1, cnt+1);
pic[x][y] = 0;
dfs(k+1, cnt);
}else dfs(k+1, cnt);
}
int main(){
//freopen("a.txt", "r", stdin);
while(~scanf("%d", &n) && n){
ans = 0;
char s[5];
for(int i = 0; i < n; i++){ //空地是0 障碍物是-1 放置物体是1
scanf("%s", s);
for(int j = 0; j < n; j++){
if(s[j] == '.')
pic[i][j] = 0;
else pic[i][j] = -1;
}
}
dfs(0, 0);
cout << ans << endl;
}
return 0;
}