hdu1198(模拟搜索)
这个题目,比较恶心,思路很是简单,就是模拟的时候有些麻烦......水题
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
char s[100][100];
int t[400][400],vist[400][400];
int n,m;
int p[13][3][3]={
{
0,1,0,
1,1,0,
0,0,0
},
{
0,1,0,
0,1,1,
0,0,0,
},
{
0,0,0,
1,1,0,
0,1,0,
},
{
0,0,0,
0,1,1,
0,1,0,
},
{
0,1,0,
0,1,0,
0,1,0,
},
{
0,0,0,
1,1,1,
0,0,0,
},
{
0,1,0,
1,1,1,
0,0,0,
},
{
0,1,0,
1,1,0,
0,1,0,
},
{
0,0,0,
1,1,1,
0,1,0,
},
{
0,1,0,
0,1,1,
0,1,0,
},
{
0,1,0,
1,1,1,
0,1,0,
}
};
int fx[4][2]={1,0,-1,0,0,1,0,-1};
void dfs(int x,int y)
{
for(int i=0;i<4;i++)
{
int mx=fx[i][0]+x;
int my=fx[i][1]+y;
if(0<=mx&&mx<3*n&&my>=0&&my<3*m&&!vist[mx][my]&&t[mx][my]==1)
{
vist[mx][my]=1;
dfs(mx,my);
}
}
}
int main()
{
while(scanf("%d%d",&n,&m)>0)
{
if(n==-1&&m==-1) break;
for(int i=0;i<n;i++)
scanf("%s",s[i]);
int cnt=0;
memset(t,0,sizeof(t));
memset(vist,0,sizeof(vist));
for(int i=1;i<3*n;i+=3)
{
//if(i%2==0)
//continue;
for(int j=1;j<3*m;j+=3)
{
//if(j%2==0)
//continue;
int tmp=i-1;
int tmp1=j-1;
int hang=cnt/m;
int lie=cnt%m;
int x=s[hang][lie]-'A';
cnt++;
for(int r=tmp;r<=i+1;r++)
for(int ll=tmp1;ll<=j+1;ll++)
{
if(t[r][ll]==0)
t[r][ll]=p[x][r-tmp][ll-tmp1];
}
}
}
/*for(int i=0;i<3*n;i++)
{
for(int j=0;j<3*m;j++)
printf("%d",t[i][j]);
printf("\n");
}*/
int sum=0;
for(int i=1;i<3*n;i+=3)
{
for(int j=1;j<3*m;j+=3)
{
if(!vist[i][j]&&t[i][j]==1)
{
dfs(i,j);
sum++;
}
}
}
printf("%d\n",sum);
}
return 0;
}
朋友们,虽然这个世界日益浮躁起来,只要能够为了当时纯粹的梦想和感动坚持努力下去,不管其它人怎么样,我们也能够保持自己的本色走下去。

浙公网安备 33010602011771号