题意:在图上尽可能的放最多的车
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int MAXN = 10 ;
char s[MAXN];
int n,set[MAXN][MAXN];
bool place(int r,int c) // 检查(r,c)的前 r行 ,前 c 列
{
for (int i = r ; i >= 0 ; i--)
if (set[i][c] < 0 )
return false ;
else if (!set[i][c]) //在没遇到别的车的时候遇到墙,就表示可以放了,至于墙的另一边我们在之前就已经确定了
break;
for (int j = c ; j >= 0 ; j--)
if (set[r][j] < 0 )
return false;
else if (!set[r][j])
break;
return true;
}
int dfs(int i,int j) // 表示到(i,j)点所能放的最大个数
{
int cnt = 0 ,max = 0 ;
while ( i < n )
{
if (set[i][j] && place(i,j))
{
set[i][j] = -1 ; // 已经放置
cnt = dfs(i,j+1) + 1 ;
if(cnt > max)
max = cnt ;
set[i][j] = 1 ; // 回溯
}
if (j >= n - 1)
{
i++;
j = 0 ;
}
else j++;
}
return max ;
}
int main()
{
while (scanf("%d",&n) && n)
{
for (int i = 0 ; i < n ; i++)
{
scanf("%s",s);
for (int j = 0 ; j < n ; j++)
{
if (s[j] == '.')
set[i][j] = 1;
else set[i][j] = 0 ;
}
}
printf("%d\n",dfs(0,0));
}
return 0;
}