首页 > 代码库 > UVA10047_The Monocycle
UVA10047_The Monocycle
这题。。。。有点奇葩,但是不难。
在矩形方阵里,某人可以往前走或者左拐右拐。都需要消耗一个单位时间。
问某人从一个点走向另一个点的最短时间,并且走过的路程是5的倍数。
由于n,m都小,直接f[n][m][direction][color],表示所有状态,bfs更新即可。
召唤代码君:
#include <iostream>#include <cstdio>#include <cstring>#include <queue>using namespace std;int dx[4]={-1,0,1,0};int dy[4]={0,1,0,-1};int f[30][30][4][5];//position,direction,colorchar s[30][30];int n,m;bool inside(int cx,int cy){ return cx>0 && cx<=n && cy>0 && cy<=m;}void _init(){ for (int i=1; i<=n; i++) for (int j=1; j<=m; j++) for (int x=0; x<4; x++) for (int y=0; y<5; y++) f[i][j][x][y]=99999999;}int _process(){ queue<int> qx,qy,qd,qc; for (int i=1; i<=n; i++) { scanf("%s",s[i]+1); for (int j=1; s[i][j]; j++) if (s[i][j]==‘S‘) { f[i][j][0][0]=0; qx.push(i),qy.push(j),qd.push(0),qc.push(0); } } while (!qx.empty()) { int cx=qx.front(),cy=qy.front(),cd=qd.front(),cc=qc.front(); qx.pop(),qy.pop(),qd.pop(),qc.pop(); int tmp=(cd+3)%4; if (f[cx][cy][cd][cc]+1<f[cx][cy][tmp][cc]) { f[cx][cy][tmp][cc]=f[cx][cy][cd][cc]+1; qx.push(cx),qy.push(cy),qd.push(tmp),qc.push(cc); /* cout<<" inside : "<<cx<<‘ ‘<<cy<<‘ ‘<<tmp<<‘ ‘; cout<<cc<<‘ ‘<<f[cx][cy][tmp][cc]<<endl; */ } tmp=(cd+1)%4; if (f[cx][cy][cd][cc]+1<f[cx][cy][tmp][cc]) { f[cx][cy][tmp][cc]=f[cx][cy][cd][cc]+1; qx.push(cx),qy.push(cy),qd.push(tmp),qc.push(cc); /* cout<<" inside : "<<cx<<‘ ‘<<cy<<‘ ‘<<tmp; cout<<‘ ‘<<cc<<‘ ‘<<f[cx][cy][tmp][cc]<<endl; */ } if (!inside(cx+dx[cd],cy+dy[cd]) || s[cx+dx[cd]][cy+dy[cd]]==‘#‘) continue; if (f[cx][cy][cd][cc]+1<f[cx+dx[cd]][cy+dy[cd]][cd][(cc+1)%5]) { f[cx+dx[cd]][cy+dy[cd]][cd][(cc+1)%5]=f[cx][cy][cd][cc]+1; if (s[cx+dx[cd]][cy+dy[cd]]==‘T‘ && (cc+1)%5==0) return f[cx+dx[cd]][cy+dy[cd]][cd][0]; qx.push(cx+dx[cd]),qy.push(cy+dy[cd]),qd.push(cd),qc.push((cc+1)%5); /* cout<<" inside : "<<cx+dx[cd]<<‘ ‘<<cy+dy[cd]<<‘ ‘<<cd; cout<<‘ ‘<<(cc+1)%5<<‘ ‘<<f[cx+dx[cd]][cy+dy[cd]][cd][(cc+1)%5]<<endl; */ } } return -1;}int main(){ //freopen("data.in","rb",stdin); int cas=0; while (scanf("%d%d",&n,&m) && (n|m)) { _init(); int ans=_process(); if (cas) printf("\n"); printf("Case #%d\n",++cas); if (ans==-1) puts("destination not reachable"); else printf("minimum time = %d sec\n",ans); } return 0;}
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。