题意: 在一个n*n的图中,X表示墙,.表示空地,要求在空地上放置堡垒,且两个堡垒不能放在同一行或同一列上,除非中间隔着一堵墙。求能放置堡垒的最大数量。
n最大为4
# include<bits/stdc++.h>
using namespace std;
char g[6][6];
int n;
int res;
bool jug(int x, int y)
{
if(g[x][y]=='X') return false;
for(int i = x; i<=n && g[i][y]!='X'; i++)
if(g[i][y] == '@') return false;
for(int i = x; i>=1 && g[i][y]!='X'; i--)
if(g[i][y] == '@') return false;
for(int j = y; j<=n && g[x][j]!='X'; j++)
if(g[x][j] == '@') return false;
for(int j = y; j>=1 && g[x][j]!='X'; j--)
if(g[x][j] == '@') return false;
return true;
}
void dfs(int x, int y, int tot)
{
if(y>n)
{
x++;
y = 1;
}
if(x == n && y == n)
{
if(jug(x,y)) tot++;
res = max(tot,res);
return;
}
if(jug(x,y))
{
g[x][y] = '@';
dfs(x,y+1,tot+1);
g[x][y] = '.';
}
dfs(x,y+1,tot);
}
int main()
{
while(scanf("%d",&n) && n!=0)
{
res = -1;
for(int i = 1; i<=n; i++)
{
for(int j = 1; j<=n; j++)
cin>>g[i][j];
}
dfs(1,1,0);
cout<<res<<endl;
}
}