#include<iostream>
using namespace std;
//1002:火网问题
int main()
{
int n,i=1,i1,j,k,t,j1,k1,j2,k2,mark1=1,mark2=1,num;int mum[4][4];
while(cin>>n)
{
if(n==0)
break;//遇到0停止
char a[4][4];char b[4][4];char c[4][4];
for(j=0;j<n;j++)
for(k=0;k<n;k++)
{
cin>>a[j][k];
}//输入地图的形状“x”代表墙“.”代表街道
for(j1=0;j1<n;j1++)
for(k1=0;k1<n;k1++)
b[j1][k1]=a[j1][k1];//复制一份地图;
for(j1=0;j1<n;j1++)
for(k1=0;k1<n;k1++)
c[j1][k1]=a[j1][k1];//保存一份地图
for(j1=0;j1<n;j1++)
for(k1=0;k1<n;k1++)
{//cout<<'c';
if(b[j1][k1]=='.')//找到街道
{//cout<<'c';
for(j2=0;j2<n;j2++)
for(k2=0;k2<n;k2++)
a[j2][k2]=c[j2][k2];//复制原地图
a[j1][k1]='1';//赋值为城堡用“1”表示
for(j=0;j<n;j++)
for(k=0;k<n;k++)
{
if(a[j][k]=='.')
{
for(t=0;t<n;t++)
{
if(a[j][t]=='1')
{
if(t<k)
mark1=0;//遇到西面有城堡就不能再造
else
{
mark1=0;
break;
}//遇到东面有城堡就肯定不能再造
}
else
if(a[j][t]=='x')
{
if(t<k)
mark1=1;//西面是墙,可以造城堡
else
break;//东面是墙,就看西面情况
}
}//东西向判断是否可以建立城堡,
for(t=0;t<n;t++)
{
if(a[t][k]=='1')
{
if(t<j)
mark2=0;//北面有城堡不能再建
else
{
mark2=0;
break;
}//南面有城堡肯定不能建城堡
}
else
if(a[t][k]=='x')
{
if(t<j)
mark2=1;//北面遇墙可建城堡
else
break;//南面遇墙看北面情况
}
}//南北向判断是否可以建立城堡
if(mark1==1&&mark2==1)
{
a[j][k]='1';
i++;
}
}//在地图建尽可能多的城堡
mark1=1;mark2=1;//找完后赋回初值,进入下一轮造城
/*cout<<a[j][k];
if(k==3)cout<<endl;
if(j==3&&k==3)cout<<endl;*/
}
}
mum[j1][k1]=i;//记录可造城堡数
if(b[j1][k1]=='x')
mum[j1][k1]=0;//如果遇到墙就不能在墙上造城堡
//cout<<mum[j1][k1]<<" ";
i=1;//赋初值进入下一个情况
}
num=0;
for(i1=0;i1<n;i1++)
for(j=0;j<n;j++)
if(num<mum[i1][j])
num=mum[i1][j];
cout<<num<<endl;//找到最大的建城数并输出
}
return 0;//返回整型数
}
/*在一张地图上建立最多的城堡‘1’:地图有n行n列的方格构成(n小于5)
上面有街道‘.’和墙‘x’,街道上可以建立城堡,城堡是有攻击性的它能
攻击东西南北,如果城堡之间可以互相攻击,那么城堡就会毁坏,只有墙能
抵抗城堡的攻击。
输入:输入地图的形状,用int n表示地图的行列数,街道用“.”表示,墙用“x”
表示,输入0表示结束;
输出:输出该张地图可建城堡的最大数;
*/
有人能帮我解决下吗?传上去是错误的。