首先声明 这个代码是错的。。。
#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
int dp[100];
int n,m;
int dir[8][2]={{-1,0},{1,0},{0,-1},{0,1},{-1,-1},{1,-1},{-1,1},{1,1}};
char s[1000][1000];
bool god(int x,int y)
{
if(x>=0&&x<n&&y>=0&&y<m)
return true;
else
return false;
}
void input()
{
int i;
int j;
for(i=0;i<n;i++)
scanf("%s",s[i]);
}
int v[1000][1000];
int cnt;
void dfs(int x,int y)
{
v[x][y]=1;
cnt++;
int i;
//int nx;
//int ny;
for(i=0;i<8;i++)
{
int nx=x+dir[i][0];
int ny=y+dir[i][1];
if(god(nx,ny)&&s[nx][ny]=='M'&&v[nx][ny]==0)
dfs(nx,ny);
}
}
int main()
{
int mx;
int my;
int i,j;
while(scanf("%d%d",&n,&m)!=EOF)
{
memset(v,0,sizeof(v));
memset(dp,0,sizeof(dp));
input();
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
cnt=0;
if(s[i][j]=='M'&&v[i][j]==0)
{
mx=i;
my=j;
dfs(i,j);
if(cnt==22)
dp['I'-'A']=1;
else if(cnt==24)
dp['L'-'A']=1;
else if(cnt==27)
dp['J'-'A']=1;
else if(cnt==28)
dp['Y'-'A']=1;
else if(cnt==31)
dp['Z'-'A']=1;
else if(cnt==33)
dp['A'-'A']=1;
else if(cnt==37)
dp['H'-'A']=1;
else if(cnt==44)
dp['E'-'A']=1;
else if(cnt==48)
dp['Q'-'A']=1;
else if(cnt==49)
dp['B'-'A']=1;
else if(cnt==34)
{
if(s[i+1][j+1]=='M')
dp['T'-'A']=1;
else
dp['C'-'A']=1;
}
else if(cnt==36)
{
if(s[i+6][j]=='1')
dp['K'-'A']=1;//倒K
else if(s[i+1][j+8]=='M')
dp['K'-'A']=1;
else
dp['F'-'A']=1
}
else if(cnt==38)
{
if(s[i+2][j+2]=='M')
dp['G'-'A']=1;//倒G
else if(s[i+1][j]=='M')
dp['G'-'A']=1;//正G
else if(s[i+6][j]=='1')
dp['U'-'A']=1;
else dp['P'-'A']=1;
}
else if(cnt==40)
{
if(s[i][j+5]=='M')
dp['O'-'A']=1;
else if(s[i][j+3]=='M')
dp['V'-'A']=1;
else if(s[i+1][j]=='M')
dp['W'-'A']=1;
else
dp['X'-'A']=1;
}
else if(cnt==42)
{
if(s[i+1][j+3]=='M')
dp['N'-'A']=1;
else
dp['D'-'A']=1;
}
else if(cnt==43)
{
if(s[i][j+10]=='M')
dp['R'-'A']=1;
else if(s[i][j+7])
dp['S'-'A']=1;
else
dp['R'-'A']=1;
}
}
}
}
for(i=0;i<26;i++)
{
if(dp[i]==1)
printf("%c",'A'+i);
}
printf("\n");
}
return 0;
}
很幼稚的想数个数,加判重。做到后来发现,有点困难,字母相互重叠的时候有可能会判错。应该多思考一下再写的。