题意:“.”的地方可以放碉堡,“X”的地方是墙壁,要求在图上放碉堡,但是碉堡的上下左右四个方向不能有碉堡,除非有“X”墙壁隔着,求最多可以放的碉堡数。
思路:dfs
哎。。。DFS能力还是不到位啊。。。有时间要试试用匈牙利写,因为想练练二分图。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
char map[10][10];
bool vis[10][10];
int n , ans;
bool check(int i , int j) {
int k;
for(k = i ; k >=0 ; k --) {//往上
if(map[k][j]=='D') return false;
if(map[k][j]=='X') break;
}
for(k = i ; k < n ; k ++) {//往下
if(map[k][j]=='D') return false;
if(map[k][j]=='X') break;
}
for(k = j ; k >=0 ; k --) {//往左
if(map[i][k]=='D') return false;
if(map[i][k]=='X') break;
}
for(k = j ; k < n ; k ++) {//往右
if(map[i][k]=='D') return false;
if(map[i][k]=='X') break;
}
return true;
}
void dfs(int num) {
int i , j;
if(num > ans) ans = num;
for(i = 0 ; i < n ; i ++)
for(j = 0 ; j < n ; j ++) {
if(!vis[i][j]&&map[i][j]=='.'&&check(i , j)) {
map[i][j] = 'D';
vis[i][j] = 1;
dfs(num+1);
vis[i][j] = 0;
map[i][j] = '.';
}
}
}
int main() {
int i;
while(scanf("%d",&n)!=EOF) {
if(n == 0) break;
for(i = 0 ; i < n ; i ++)
cin>>map[i];
memset(vis,0,sizeof(vis));
ans = 0;
dfs(0);
printf("%d\n",ans);
}
}