题目大意: 一个地图里面有三种元素,分别为"@",".","#",其中@为人的起始位置,"#"可以想象为墙,然后.为可以走的空地,求人可以走的最大点数。 解题思路: 好吧,搜索入门题,直接广度搜索,标志入队的次数。入队的次数即为行走的步数。 代码:
#include#includeconst int MAX=25;using namespace std;typedef struct node{ int x,y; int step;}N;int c,r;bool visited[MAX][MAX];char map[MAX][MAX];int dir[4][2]={ {-1,0},{0,1},{1,0},{0,-1}};//上,右,下,左int step;void init(){ memset(visited,false,sizeof(visited)); step=0;}int BFS(int sx,int sy){ queue Q; N pre,cur; pre.x=sx; pre.y=sy; pre.step=1; visited[pre.x][pre.y]=true; Q.push(pre); while(!Q.empty()) { pre=Q.front(); Q.pop(); step++; for(int i=0;i<4;i++) { cur=pre; cur.x=pre.x+dir[i][0]; cur.y=pre.y+dir[i][1]; if(cur.x>=1 && cur.x<=r && cur.y>=1 && cur.y<=c && visited[cur.x][cur.y]==false && map[cur.x][cur.y]=='.') { visited[cur.x][cur.y]=true; cur.step++; Q.push(cur); } } } return step;}int main(void){ while(scanf("%d%d",&c,&r),r||c) { int sx,sy; for(int i=1;i<=r;i++) { scanf("%s",map[i]+1); for(int j=1;j<=c;j++) { if(map[i][j]=='@') { sx=i; sy=j; } } } init(); int ans=BFS(sx,sy); cout<