第一行数据n,m表示地图的行和列,接下来的n行m列为地图,startx,starty表示小人的起点。
本题可以采用深搜或者广搜,因为边界全为'#',所以本题不用考虑边界问题。
深搜代码如下:
#includeint max,num,mx,my; int v[30][30]; char s[30][30]; int getnum(int x,int y); int dfs(int x,int y); int main(void) { int n,m,startx,starty; // n 行 m 列 int i,j; scanf("%d%d%d%d",&n,&m,&startx,&starty); for(i=0;i ) { getchar(); for(j=0;j ) { scanf("%c",&s[i][j]); } } dfs(startx,starty); printf("%d %d\n",mx,my); printf("%d\n",max); return 0; } int dfs(int x,int y) { if(s[x][y]=='#'||s[x][y]=='G') { return 0; } if(v[x][y]==0&&s[x][y]=='.') { v[x][y]=1; num=getnum(x,y); if(max<num) { max=num; mx=x; my=y; } dfs(x+1,y); dfs(x-1,y); dfs(x,y+1); dfs(x,y-1); } } int getnum(int x,int y) { int i; num=0; for(i=x;s[i][y]!='#';i++) { if(s[i][y]=='G') { num++; } } for(i=x;s[i][y]!='#';i--) { if(s[i][y]=='G') { num++; } } for(i=y;s[x][i]!='#';i++) { if(s[x][i]=='G') { num++; } } for(i=y;s[x][i]!='#';i--) { if(s[x][i]=='G') { num++; } } return num; }
广搜代码如下:
#includeint max,num,mx,my; char s[30][30]; struct note { int x; int y; int f; int s; }; int getnum(int x,int y); int main(void) { int v[30][30]; struct note que[1000]; int next[4][2]={{0,1},{1,0},{0,-1},{-1,0}}; int n,m,startx,starty,i,j,k,head,tail,tx,ty; // n 行 m 列 scanf("%d%d%d%d",&n,&m,&startx,&starty); for(i=0;i ) { getchar(); for(j=0;j ) { scanf("%c",&s[i][j]); } } head=tail=1; que[tail].x=startx; que[tail].y=starty; que[tail].f=0; que[tail].s=0; tail++; v[startx][starty]=1; while(head<tail) { for(k=0;k<4;k++) { tx=que[head].x+next[k][0]; ty=que[head].y+next[k][1]; if(s[tx][ty]=='#'||s[tx][ty]=='G') { continue; } if(v[tx][ty]==0&&s[tx][ty]=='.') { num=getnum(tx,ty); if(max<num) { max=num; mx=tx; my=ty; } v[tx][ty]=1; que[tail].x=tx; que[tail].y=ty; que[tail].f=head; que[tail].s=que[head].s+1; tail++; } } head++; } printf("%d %d\n",mx,my); printf("%d\n",max); return 0; } int getnum(int x,int y) { int i,j,k; num=0; for(i=x;s[i][y]!='#';i++) { if(s[i][y]=='G') { num++; } } for(i=x;s[i][y]!='#';i--) { if(s[i][y]=='G') { num++; } } for(i=y;s[x][i]!='#';i++) { if(s[x][i]=='G') { num++; } } for(i=y;s[x][i]!='#';i--) { if(s[x][i]=='G') { num++; } } return num; }
附上一组测试数据:
13 13 3 3
#############
#GG.GGG#GGG.#
###.#G#G#G#G#
#.......#..G#
#G#.###.#G#G#
#GG.GGG.#.GG#
#G#.#G#.#.#.#
##G...G.....#
#G#.#G###.#G#
#...G#GGG.GG#
#G#.#G#G#.#G#
#GG.GGG#G.GG#
#############
答案为:
7 11
10