Blackie @ 2016-10-16 17:04:12
想到用宽搜,但答案错掉了。。
每一个点都记录一个方向与转的次数,向四个方向宽搜,如果方向不对头就把turn+1,最后到达的时候输出turn。
全部搜一遍没搜到就-1.
但是、但是为什么就30分。。【委屈脸】写了我40分钟啊。。
代码贴一下(暴丑无比不过还是希望大神能看看。。)
#include<iostream>
using namespace std;
const int UP=1,DOWN=2,LEFT=3,RIGHT=4;
int n,head=1,tail=1,destinationx,destinationy;
struct node
{
char here;
int turn;
int x;
int y;
int direction;
}map[101][101],que[1001];
void push(node a)
{
que[tail]=a;
tail++;
return;
}
node pop()
{
head++;
return que[head-1];
}
bool empty()
{
if(head==tail)
return true;
return false;
}
void bfs()
{
node top;
while(empty()==false)
{
top=pop();
map[top.x][top.y]=top;
if(top.x==destinationx && top.y==destinationy)
{
cout<<top.turn<<endl;
return;
}
if(top.direction==0)
{
if(map[top.x-1][top.y].here=='.' && map[top.x-1][top.y].turn==-1 && top.x-1>=1)
{
map[top.x-1][top.y].direction=UP;
map[top.x-1][top.y].turn=0;
push(map[top.x-1][top.y]);
}
if(map[top.x+1][top.y].here=='.' && map[top.x+1][top.y].turn==-1 && top.x+1<=n)
{
map[top.x+1][top.y].direction=DOWN;
map[top.x+1][top.y].turn=0;
push(map[top.x+1][top.y]);
}
if(map[top.x][top.y-1].here=='.' && map[top.x][top.y-1].turn==-1 && top.y-1>=1)
{
map[top.x][top.y-1].direction=LEFT;
map[top.x][top.y-1].turn=0;
push(map[top.x][top.y-1]);
}
if(map[top.x][top.y+1].here=='.' && map[top.x][top.y+1].turn==-1 && top.y+1<=n)
{
map[top.x][top.y+1].direction=RIGHT;
map[top.x][top.y+1].turn=0;
push(map[top.x][top.y+1]);
}
continue;
}//起始状况
if(map[top.x-1][top.y].here=='.' && map[top.x-1][top.y].turn==-1 && top.x-1>=1)
{
map[top.x-1][top.y].direction=UP;
if(top.direction!=UP)
map[top.x-1][top.y].turn=top.turn+1;
else
map[top.x-1][top.y].turn=top.turn;
push(map[top.x-1][top.y]);
}
if(map[top.x+1][top.y].here=='.' && map[top.x+1][top.y].turn==-1 && top.x+1<=n)
{
map[top.x+1][top.y].direction=DOWN;
if(top.direction!=DOWN)
map[top.x+1][top.y].turn=top.turn+1;
else
map[top.x+1][top.y].turn=top.turn;
push(map[top.x+1][top.y]);
}
if(map[top.x][top.y-1].here=='.' && map[top.x][top.y-1].turn==-1 && top.y-1>=1)
{
map[top.x][top.y-1].direction=LEFT;
if(top.direction!=LEFT)
map[top.x][top.y-1].turn=top.turn+1;
else
map[top.x][top.y-1].turn=top.turn;
push(map[top.x][top.y-1]);
}
if(map[top.x][top.y+1].here=='.' && map[top.x][top.y+1].turn==-1 && top.y+1<=n)
{
map[top.x][top.y+1].direction=RIGHT;
if(top.direction!=RIGHT)
map[top.x][top.y+1].turn=top.turn+1;
else
map[top.x][top.y+1].turn=top.turn;
push(map[top.x][top.y+1]);
}//向四个方向搞
}//while !empty();
cout<<-1<<endl;
return;
}
void read()
{
int i,j;
cin>>n;
for(i=1; i<=n; i++)
for(j=1; j<=n; j++)
{
cin>>map[i][j].here;
map[i][j].x=i;
map[i][j].y=j;
map[i][j].turn=-1;
map[i][j].direction=-1;
if(map[i][j].here=='A')
{
map[i][j].direction=0;
push(map[i][j]);
}
if(map[i][j].here=='B')
{
destinationx=i;
destinationy=j;
map[i][j].here='.';
}
}
bfs();
return;
}
int main()
{
read();
return 0;
}
by 浮尘ii @ 2016-10-16 20:46:40
@Blackie
请注意BFS的原理,广度优先搜索是把同层的结点扩展到再扩展下一层。
这题如果使用BFS需要一次性把转弯turn次的状态全部扩展到。
并不能保证最短的路程转弯数也最少。
by Blackie @ 2016-10-16 22:52:30
藕!!我懂了!!
感谢感谢!!
非常谢谢!
@qq2477259579