标签:搜索
Description
Input
Output
Sample Input
2 8 8 ######## #......# #.####.# #.####.# #.####.# #.####.# #...#..# #S#E#### 9 5 ######### #.#.#.#.# S.......E #.#.#.#.# #########
Sample Output
37 5 5 17 17 9
这道题求最短路可以用bfs,但是求绕墙走的时间时不用搜索,因为一定只有唯一的一条路,绕墙走有优先考虑左边和右边两种情况,考虑左边的时候,如果能往左走就往做,否则再考虑能不能向前走,即按原来的方向,如果也不行,再看能不能往右走,如果三种情况都不行,就往后走,这里要开一个数组记录方向。
#include<stdio.h> #include<string.h> #include<math.h> char map[45][45]; int tab[8][2]={0,0,0,1,-1,0,0,-1,1,0},dir,b[45][45]; int q[1111111][2],x3,y3,x2,y2,n,m; void bfs() { memset(q,0,sizeof(q)); memset(b,0,sizeof(b)); b[x2][y2]=1; int front=1,rear=1,xx,yy,i,x,y; q[front][0]=x2;q[front][1]=y2; while(front<=rear){ x=q[front][0]; y=q[front][1]; if(x==x3 && y==y3)break; front++; for(i=1;i<=4;i++){ xx=x+tab[i][0];yy=y+tab[i][1]; if(xx>=0 && xx<m && yy>=0 && yy<n && map[xx][yy]!=‘#‘){ map[xx][yy]=‘#‘; b[xx][yy]=b[x][y]+1; rear++; q[rear][0]=xx; q[rear][1]=yy; } } } return ; } int main() { int T,i,j,num1,num2,num3,x,y,dir1,xx,yy,dir2; scanf("%d",&T); while(T--) { scanf("%d%d",&n,&m); for(i=0;i<m;i++){ scanf("%s",map[i]); for(j=0;j<n;j++){ if(map[i][j]==‘S‘){ x2=i;y2=j; } else if(map[i][j]==‘E‘){ x3=i;y3=j; } } } if(y2==1)dir=1; else if(x2==m)dir=2; else if(y2==n)dir=3; else if(x2==1)dir=4; num1=0; memset(b,0,sizeof(b)); x=x2,y=y2,num1=1,dir1=dir; while(1) { if(x==x3 && y==y3)break; num1++; //printf("%d %d\n",x+1,y+1); xx=x+tab[dir1%4+1][0]; yy=y+tab[dir1%4+1][1]; if(xx>=0 && xx<m && yy>=0 && yy<n && map[xx][yy]!=‘#‘){ x=xx;y=yy; dir1=dir1%4+1;continue; } xx=x+tab[dir1][0]; yy=y+tab[dir1][1]; if(xx>=0 && xx<m && yy>=0 && yy<n && map[xx][yy]!=‘#‘){ x=xx;y=yy;continue; } xx=x+tab[(dir1==1)?4:(dir1-1)][0]; yy=y+tab[(dir1==1)?4:(dir1-1)][1]; if(xx>=0 && xx<m && yy>=0 && yy<n && map[xx][yy]!=‘#‘){ x=xx;y=yy; dir1=(dir1==1?4:(dir1-1));continue; } dir1=(dir1+1)%4+1; x=x+tab[dir1][0]; y=y+tab[dir1][1]; } //printf("%d\n",num1); memset(b,0,sizeof(b)); x=x2,y=y2,num2=1,dir2=dir; while(1) { if(x==x3 && y==y3)break; num2++; //printf("%d %d\n",x+1,y+1); xx=x+tab[(dir2==1)?4:(dir2-1)][0]; yy=y+tab[(dir2==1)?4:(dir2-1)][1]; if(xx>=0 && xx<m && yy>=0 && yy<n && map[xx][yy]!=‘#‘){ x=xx;y=yy; dir2=(dir2==1?4:(dir2-1));continue; } xx=x+tab[dir2][0]; yy=y+tab[dir2][1]; if(xx>=0 && xx<m && yy>=0 && yy<n && map[xx][yy]!=‘#‘){ x=xx;y=yy;continue; } xx=x+tab[dir2%4+1][0]; yy=y+tab[dir2%4+1][1]; if(xx>=0 && xx<m && yy>=0 && yy<n && map[xx][yy]!=‘#‘){ x=xx;y=yy; dir2=dir2%4+1;continue; } dir2=(dir2+1)%4+1; x=x+tab[dir2][0]; y=y+tab[dir2][1]; } map[x2][y2]=‘#‘; bfs(); num3=b[x3][y3]; printf("%d %d %d\n",num1,num2,num3); } return 0; }
poj3083 Children of the Candy Cor
标签:搜索
原文地址:http://blog.csdn.net/kirito_acmer/article/details/45439629