这道模拟题说起来也不是特别难,就是能不能想起来的问题了,刚看的时候,知道这是一道模拟题,但是没有想到怎能模拟,就没有做出来,还有一个细节问题,就是我模拟的时候,不知道’\‘用’\\‘表示,所以我当时就感觉自己的基础太烂了,还是要背着基础跑啊。
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3944
代码:
#include <stdio.h>
#include <string.h>
#define ms(a,b) memset(a,b,sizeof(a))
int ans,h,w;
char map[105][105];
void dfst(int x,int y)
{
int dx[]= {1,1,1,2,2};
int dy[]= {-1,0,1,-1,1};
char fh[]= {'/','|','\\','(',')'};
for(int i=0; i<5; i++)
{
int nx=x+dx[i],ny=y+dy[i];
if(nx>=0 && nx<h && ny>=0 && ny<w && map[nx][ny]==fh[i])
{
map[nx][ny]='.';
}
}
}
void dfss(int x,int y)
{
if(map[x][y]=='/')
{
int dx[]= {-1,0,0,1,1};
int dy[]= {1,1,2,0,2};
char fh[]= {'O','|','\\','(',')'};
for(int i=0; i<5; i++)
{
int nx=x+dx[i],ny=y+dy[i];
if(nx>=0 && nx<h && ny>=0 && ny<w && map[nx][ny]==fh[i])
{
map[nx][ny]='.';
}
}
}
else if(map[x][y]=='|')
{
int dx[]= {-1,0,0,1,1};
int dy[]= {0,-1,1,-1,1};
char fh[]= {'O','/','\\','(',')'};
for(int i=0; i<5; i++)
{
int nx=x+dx[i],ny=y+dy[i];
if(nx>=0 && nx<h && ny>=0 && ny<w && map[nx][ny]==fh[i])
{
map[nx][ny]='.';
}
}
}
else if(map[x][y]=='\\')
{
int dx[]= {-1,0,0,1,1};
int dy[]= {-1,-2,-1,-2,0};
char fh[]= {'O','/','|','(',')'};
for(int i=0; i<5; i++)
{
int nx=x+dx[i],ny=y+dy[i];
if(nx>=0 && nx<h && ny>=0 && ny<w && map[nx][ny]==fh[i])
{
map[nx][ny]='.';
}
}
}
}
void dfsj(int x,int y)
{
if(map[x][y]=='(')
{
int dx[]= {-2,-1,-1,-1,0};
int dy[]= {1,0,1,2,2};
char fh[]= {'O','/','|','\\',')'};
for(int i=0; i<5; i++)
{
int nx=x+dx[i],ny=y+dy[i];
if(nx>=0 && nx<h && ny>=0 && ny<w && map[nx][ny]==fh[i])
{
map[nx][ny]='.';
}
}
}
else if(map[x][y]==')')
{
int dx[]= {-2,-1,-1,-1,0};
int dy[]= {-1,-2,-1,0,-2};
char fh[]= {'O','/','|','\\','('};
for(int i=0; i<5; i++)
{
int nx=x+dx[i],ny=y+dy[i];
if(nx>=0 && nx<h && ny>=0 && ny<w && map[nx][ny]==fh[i])
{
map[nx][ny]='.';
}
}
}
}
int main()
{
//freopen("l.txt","r",stdin);
int T;
scanf("%d",&T);
while(T--)
{
ans=0;
ms(map,'.');
scanf("%d %d",&h,&w);
getchar();
for(int i=0; i<h; i++)
{
for(int j=0; j<w; j++)
{
scanf("%c",&map[i][j]);
}
getchar();
}
for(int i=0; i<h; i++)
{
for(int j=0; j<w; j++)
{
if(map[i][j]=='.')
{
continue;
}
else if(map[i][j]=='O')
{
dfst(i,j);
ans++;
}
else if(map[i][j]=='/'||map[i][j]=='|'||map[i][j]=='\\')
{
dfss(i,j);
ans++;
}
else if(map[i][j]=='('||map[i][j]==')')
{
dfsj(i,j);
ans++;
}
map[i][j]='.';
}
}
printf("%d\n",ans);
}
return 0;
}
基本思路:当每一次找到一个身体部件的时候,就开始按照小人的图形遍历,发现一个其他的身体部件,就把它变成一个点,遍历一遍,就好了,还是思维比较禁锢,没有想起来,知识面有点窄啊,还是要多做题才行啊。