尼玛啊,一道很普通的深搜居然因为括号问题改了这么长时间,自己改代码的能力好低啊。。。
不过通过本题还是能感觉到dfs的强大,一个while居然可以遍历几乎整个图。。。
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <queue>
#include <iostream>
using namespace std;
const int N = 30;
const int INF = 1000000;
int Map[N][N];
int n, maxx;
int dir[4][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
void dfs(int sum)
{
int i, j, k, flag;
maxx = max(maxx, sum);
for(j = 1; j <= n; j ++)
for(k = 1; k <= n; k ++)
{
if(Map[j][k] == 0) //0 空地 1 墙 2 碉堡 -1 边界外
{
flag = 1;
for(i = 0; i < 4; i ++)
{
int xx = j;
int yy = k;
while(1)
{
xx = xx + dir[i][0];
yy = yy + dir[i][1];
if(Map[xx][yy] == 2)
{
flag = 0;
break;
}
else if(Map[xx][yy] == 1 || Map[xx][yy] == -1) break;
}
}
if(flag)
{
Map[j][k] = 2;
dfs(sum + 1);
Map[j][k] = 0;
}
}
}
}
int main()
{
// freopen("in.txt", "r", stdin);
int i, j;
char a;
while(~scanf("%d", &n) && n)
{
maxx = 0;
memset(Map, -1, sizeof(Map));
for(i=1; i<=n; i++)
for(j=1; j<=n; j++)
{
cin >> a;
if(a == '.')Map[i][j] = 0;
else Map[i][j] = 1;
}
dfs(0);
printf("%d\n", maxx);
}
return 0;
}