标签:搜索
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