除了样例,只对了最后一个点。其他wa。思路是先判断所有雌的,四个方向打上标记不能走,然后枚举每一个雄的,检测四个方向有几个格子没有标记,大于等于三答案加一。 然后清空标记,把上面的步骤雌雄反着来一遍。
#include <stdio.h>
#include <iostream>
using namespace std;
#define int long long
signed main(){
char map[1005][1005];
int ans=0;
int mark[1005][1005]={0};
int r,c,n,m;
cin>>r>>c>>n>>m;
for(int i=1;i<=r;i++)
{
for(int j=1;j<=c;j++)
{
cin>>map[i][j];
}
}
for(int i=1;i<=r;i++)
{
for(int j=1;j<=c;j++)
{
if(map[i][j]=='F')
{
mark[i][j]=1;
mark[i-1][j]=1;
mark[i+1][j]=1;
mark[i][j-1]=1;
mark[i][j+1]=1;
}
}
}
for(int i=1;i<=r;i++)
{
for(int j=1;j<=c;j++)
{
int e=0;
if(map[i][j]=='M')
{
if(mark[i-1][j]==0)e++;
if(mark[i+1][j]==0)e++;
if(mark[i][j-1]==0)e++;
if(mark[i][j+1]==0)e++;
}
if(e>=3)ans++;
}
}
for(int i=1;i<=1005;i++)
{
for(int j=1;j<=1005;j++)
{
mark[i][j]=0;
}
}
for(int i=1;i<=r;i++)
{
for(int j=1;j<=c;j++)
{
if(map[i][j]=='M')
{
mark[i][j]=1;
mark[i-1][j]=1;
mark[i+1][j]=1;
mark[i][j-1]=1;
mark[i][j+1]=1;
}
}
}
for(int i=1;i<=r;i++)
{
for(int j=1;j<=c;j++)
{
int e=0;
if(map[i][j]=='F')
{
if(mark[i-1][j]==0)e++;
if(mark[i+1][j]==0)e++;
if(mark[i][j-1]==0)e++;
if(mark[i][j+1]==0)e++;
}
if(e>=3)ans++;
}
}
// for(int i=1;i<=r;i++)
// {
// for(int j=1;j<=c;j++)
// {
// cout<<mark[i][j]<<" ";
// }
// cout<<endl;
// }
cout<<ans;
return 0;
}