UVA-639
题意:给出一个地图,x为障碍物。可以放置一些喷火器(?),可以攻击和它同行同列的东西,攻击会被x障碍物阻隔。求在这个地图上可以放多少个喷火器。
解题思路:因为地图很小,暴力枚举每个点能不能放,放下去之后对它所在的行列的可攻击范围内的计数的pd[i][j]++。只有pd[i][j]==0 的点才可以放。
/*************************************************************************
> File Name: UVA-639.cpp
> Author: Narsh
>
> Created Time: 2016年07月27日 星期三 10时27分47秒
************************************************************************/
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;
char map[10][10];
int pd[10][10];
int n,m,Max;
void dee(int x, int y, int tag) {
int k=tag*1;
pd[x][y] +=k;
for (int i = 1; x+i <=n; i++)
if (map[x+i][y] == '.') pd[x+i][y]+=k;
else break;
for (int i = 1; x-i >=1; i++)
if (map[x-i][y] == '.') pd[x-i][y]+=k;
else break;
for (int i = 1; y+i <= n; i++)
if (map[x][y+i] == '.') pd[x][y+i]+=k;
else break;
for (int i = 1; y-i >= 1; i++)
if (map[x][y-i] == '.') pd[x][y-1]+=k;
else break;
}
void dfs(int x) {
if (x > Max) Max=x;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
if (pd[i][j] == 0) {
dee(i,j,1);
dfs(x+1);
dee(i,j,-1);
}
}
int main() {
while (scanf("%d\n",&n) && n) {
memset(pd,1,sizeof(pd));
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n+1; j++) {
scanf("%c",&map[i][j]);
if (map[i][j] == '.') pd[i][j]=0;
if (map[i][j] == 'X') pd[i][j]=9999;
}
Max=0;
dfs(0);
printf("%d\n",Max);
}
}