原本打算用DFS写的,做完才发现思路变化了...神奇. 还有貌似按照老师的PDF,这题是出现并查集里面的...但是想不到怎么去并查..
#include<iostream>
#include<cstring>
using namespace std;
char tmap[6][6],map[6][6];
int num;
void DFS()
{
for(int i=1;i<=num;i++)
for(int j=1;j<=num;j++)
{
if(tmap[i][j]=='.')
{
if(tmap[i-1][j-1]=='X'||tmap[i+1][j+1]=='X'||tmap[i+1][j-1]=='X'||tmap[i-1][j+1]=='X')
{
if(tmap[i][j-1]!='X'&&tmap[i][j+1]!='X'&&tmap[i+1][j]!='X'&&tmap[i-1][j]!='X')
continue;
}
bool flag=true;
for(int k=1;k<=num;k++)//右
{
if(j+k<5)
{
if(tmap[i][j+k]=='@')
{
flag=false;
break;
}
if(tmap[i][j+k]=='X')
break;
}
}
for(int k=1;k<=num;k++)//左
{
if(j-k>0)
{
if(tmap[i][j-k]=='@')
{
flag=false;
break;
}
if(tmap[i][j-k]=='X')
break;
}
}
for(int k=1;k<=num;k++)//下,从图上看
{
if(i+k<5)
{
if(tmap[i+k][j]=='@')
{
flag=false;
break;
}
if(tmap[i+k][j]=='X')
break;
}
}
for(int k=1;k<=num;k++)//上,从图上看
{
if(i-k>0)
{
if(tmap[i-k][j]=='@')
{
flag=false;
break;
}
if(tmap[i-k][j]=='X')
break;
}
}
if(flag)
tmap[i][j]='@';
}
}
}
int main()
{
while(cin>>num&&num)
{
int Account=0;
memset(tmap,0,sizeof(tmap));
memset(map,0,sizeof(map));
for(int i=1;i<=num;i++)
for(int j=1;j<=num;j++)
{
cin>>tmap[i][j];
map[i][j]=tmap[i][j];
}
DFS();
for(int i=1;i<=num;i++)
for(int j=1;j<=num;j++)
if(tmap[i][j]=='@')
Account++;
int Account1=0;
for(int i=1;i<=num;i++)//旋转90度再计算
for(int j=1;j<=num;j++)
tmap[i][num+1-j]=map[j][i];
DFS();
for(int i=1;i<=num;i++)
for(int j=1;j<=num;j++)
if(tmap[i][j]=='@')
Account1++;
if(Account>Account1)
cout<<Account<<endl;
else
cout<<Account1<<endl;
}
return 0;
}