题目描述
监狱的每间牢房是一个不超过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 <stdio.h>
#include <stdlib.h>
#include <algorithm>
using namespace std;
char s[6];
int a[6][6];
int b[6][6];
int t=0;
int fun(int a[][6],int n,int ans)
{
if(ans>t){
t=ans;
return 0;
}
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(a[i][j]==1){
for(int p=0;p<n;p++)
for(int q=0;q<n;q++)
b[p][q]=a[p][q];
int f=1;
for(int k=j+1;k<n&&b[i][k]!=0;k++)
if(b[i][k]==2){
f=0;
break;
}
for(int k=j-1;k>=0&&b[i][k]!=0;k--)
if(b[i][k]==2){
f=0;
break;
}
for(int k=i+1;k<n&&b[k][j];k++)
if(b[k][j]==2){
f=0;
break;
}
for(int k=i-1;k>=0&&b[k][j];k--)
if(b[k][j]==2){
f=0;
break;
}
if(f==1){
b[i][j]=2;
fun(b,n,ans+1);
}
}
}
}
}
int main()
{
int n;
int w[100][100];
while(cin>>n&&n){
for(int i=0;i<n;i++){
cin>>s;
for(int j=0;s[j];j++)
if(s[j]=='X') a[i][j]=0;
else a[i][j]=1;
}
t=0;
fun(a,n,0);
printf("%d\n",t);
}
return 0;
}