题目描述
监狱的每间牢房是一个不超过4×4的正方形,里面设有一些障碍,牢房里住着的犯人脾气都很大,只要两个犯人位于同一行或同一列即会发生冲突,但障碍物可以阻挡同行或同列犯人的冲突。问最多可放几个犯人而不会发生冲突。如下图所示,左边表示初始牢房样,右边4个显示了摆放方案,当然,最后两个方案是错误的。
输入
有多组测试数据,每组数据第一行为一个整数N表示牢房大小。随后N行描述牢房,其中X表示障碍。
所有测试数据结束的标志为0。
输出
输出最多可放的犯人数。
样例输入
4
.X..
....
XX..
....
2
XX
.X
3
.X.
X.X
.X.
3
...
.XX
.XX
4
....
....
....
....
0
样例输出
5
1
5
2
4
暴力即可
#include <iostream>
#include<bits/stdc++.h>
using namespace std;
int ans,n;
char str[10][10];
void dfs(int p,int cnt)
{
if(p==n*n)
{
ans=max(ans,cnt);
return;
}
int x=p/n,y=p%n;
dfs(p+1,cnt);
if(str[x][y]=='.')
{
int op=1;
for(int i=x;i<n;i++)
{
if(str[i][y]=='X')
{
break;
}
if(str[i][y]=='Q')
{
op=0;
}
}
for(int i=x;i>=0;i--)
{
if(str[i][y]=='X')
{
break;
}
if(str[i][y]=='Q')
{
op=0;
}
}
for(int i=y;i<n;i++)
{
if(str[x][i]=='X')
{
break;
}
if(str[x][i]=='Q')
{
op=0;
}
}
for(int i=y;i>=0;i--)
{
if(str[x][i]=='X')
{
break;
}
if(str[x][i]=='Q')
{
op=0;
}
}
if(op)
{
str[x][y]='Q';
dfs(p+1,cnt+1);
str[x][y]='.';
}
}
}
int main()
{
while(scanf("%d",&n)&&n!=0)
{
ans=0;
for(int i=0;i<n;i++)
{
scanf("%s",str[i]);
}
dfs(0,0);
printf("%d\n",ans);
}
return 0;
}