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.本题涉及到了东西南北四个方向,解决办法是将每个方向规定为一个固定的值。
阅读全文
0 0
- UVA 10047 骑单车
- 骑单车的幸福
- 单车
- 单车
- 生活随笔:郊外骑单车
- 共享单车骑行分析
- 单车骑行红叶谷70KM
- 朝鲜禁止女人骑单车的荒唐理由
- 合并还是撤退,共享单车下半场“怎么骑”?
- 单车程式
- 单车帐目
- 踩单车
- 单车植物园
- 单车故事
- 单车问题
- 共享单车
- 女黑客登场:轻松破解APP,共享单车任我骑!
- 女黑客登场:轻松破解APP,共享单车任我骑!
- UVA 10256 凸包问题-点集划分
- CF
- Book测试题
- LA 4728 旋转卡壳模板
- LA 2797 Monster Trap 怪物逃脱 平面区域
- UVA 10047 骑单车
- UVA 11275 判断空间三角形是否相交
- Find a way bfs搜索 容易出错
- C
- c++中函数参数传递(值传递、指针传递,引用传递)
- CF 551B 暴力+字符串
- CF 551c 二分搜索+思维题
- UVA 10054
- cf 550A 字符串统计