UVA 10047 骑单车

来源:互联网 发布:酒店网络设计 编辑:程序博客网 时间:2024/04/28 07:22
链接;
题意:训练指南308页;
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <vector>
#include <queue>
#include <map>
#include <algorithm>
#include <set>
#define MM(a) memset(a,0,sizeof(a))
typedef long long ll;
typedef unsigned long long ULL;
const double eps = 1e-14;
const int inf = 0x3f3f3f3f;
const double pi=acos(-1);
using namespace std;

char f[30][30];
int sx,sy,tx,ty;
int step[30][30][6][6],cas=0,n,m;
bool visit[30][30][6][6];
struct node{
int x,y,c,d;
node(){};
node(int xx,int yy,int cc,int dd):x(xx),y(yy),c(cc),d(dd){}
};
node ne[20000];

int dx[5]={-1,0,1,0};//北东南西
int dy[5]={0,1,0,-1};

bool legal(node nt,int dir,int i)
{
if((dir==0&&i==2)||(dir==1&&i==3)||(dir==2&&i==0)||(dir==3&&i==1)) return false;
if(nt.x<0||nt.x>=n||nt.y<0||nt.y>=m) return false;
if(f[nt.x][nt.y]=='#') return false;
if(visit[nt.x][nt.y][nt.c][nt.d]) return false;
return true;
}

void solve()
{
printf("Case #%d\n",cas);
memset(step,inf,sizeof(step));
memset(visit,false,sizeof(visit));

node S(sx,sy,0,0);
queue<node> q;
q.push(S);
step[S.x][S.y][S.c][S.d]=0;

while(q.size())
{
node cur=q.front();q.pop();
// printf("%d %d %d %d\n",cur.x,cur.y,cur.c,cur.d);
if(cur.x==tx&&cur.y==ty&&cur.c==0)
{
printf("minimum time = %d sec\n",step[cur.x][cur.y][cur.c][cur.d]);
return;
}
visit[cur.x][cur.y][cur.c][cur.d]=true;
int dir=cur.d,color=cur.c;
for(int i=0;i<4;i++)
{
node tp;
if(i==dir) tp=(node){cur.x+dx[i],cur.y+dy[i],(cur.c+1)%5,i};
else tp=(node){cur.x,cur.y,cur.c,i};
if(!legal(tp,dir,i)) continue;
q.push(tp);
step[tp.x][tp.y][tp.c][tp.d]=step[cur.x][cur.y][cur.c][cur.d]+1;
}
}
printf("destination not reachable\n");
}

int main()
{
while(~scanf("%d %d",&n,&m))
{
if(!n&&!m) return 0;
++cas;
for(int i=0;i<n;i++)
{
scanf("%s",f[i]);
for(int j=0;j<m;j++)
if(f[i][j]=='S')
{sx=i;sy=j;}
else if(f[i][j]=='T')
{tx=i;ty=j;}
}
if(cas!=1) printf("\n");//感觉这题的输出格式有点奇怪。相邻之间一个空行可能不考虑包括输入
solve();
}
return 0;
}
需要注意的地方:
1,与传统的二维bfs不同的是,这道题目对应的是四维
2.本题涉及到了东西南北四个方向,解决办法是将每个方向规定为一个固定的值。
原创粉丝点击