Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 13487 Accepted Submission(s): 8359
6 9 ....#. .....# ...... ...... ...... ...... ...... #@...# .#..#. 11 9 .#......... .#.#######. .#.#.....#. .#.#.###.#. .#.#..@#.#. .#.#####.#. .#.......#. .#########. ........... 11 6 ..#..#..#.. ..#..#..#.. ..#..#..### ..#..#..#@. ..#..#..#.. ..#..#..#.. 7 7 ..#.#.. ..#.#.. ###.### ...@... ###.### ..#.#.. ..#.#.. 0 0
45 59 6 13
题意:
从@开始走 #是墙 计算@能走的位置 ‘.’表示可以走1地方
注意:
1:本题没有用到回溯 因为可以返回到走过的位置 但是不再增加步数
2:31行getchar()很重要
3:map 是地图 step是走下一步的方向
#include<stdio.h> #include<string.h> int a,b,ax,ay,nx,ny,s,step[4][2]= {{1,0},{-1,0},{0,1},{0,-1}}; char map[25][25]; void DFS(int x,int y) { //if(x<=0||x>b||y<=0||y>a) return ;//并没什么用 //if(map[x][y]=='#') return ;//之前这里的问题找了好久 一直没发现为什么 在被标记#后再DPS 判断#后直接return,无法进行下一步搜索 for(int i=0; i<=3; i++) { // printf("%d %d x\n",x,y); nx=x+step[i][0]; ny=y+step[i][1]; //if(nx<=0||nx>b||ny<=0||ny>a||map[nx][ny]=='#'||map[nx][ny]=='O') continue; 不符合的条件 if(map[nx][ny]=='.')//符合要求 { s++; map[nx][ny]='#'; DFS(nx,ny); } } } int main (void) { int i,ii; while(~scanf("%d%d",&a,&b),a||b) { s=0; memset(map,'0',sizeof(map)); getchar(); for(i=1; i<=b; i++) { for(ii=1; ii<=a; ii++) { scanf("%c",&map[i][ii]); if(map[i][ii]=='@') { ax=i; ay=ii; } } getchar(); } s=0; DFS(ax,ay); printf("%d\n",s+1);//没有计算起点 所以+1 } return 0; }