文章标题
2017-03-25 15:50
183 查看
题意:个你一个转轮,有5种颜色,为了5中颜色的位置是确定的,为了方便处理我们用01234来表示绿,黑,红,蓝,白。轮子可以沿着它的方向滚动(只能是它当前的方向不能相反方向),每滚动一次会到达另一个格子,着地的颜色会改变,变了之前颜色的下一个,例如当前是绿色着地下一次就是黑色,依次是红蓝白。也可以原地转动(顺逆时针都可以),原地转动其实就是改变了轮子的滚动方向,原地转动每次能转90度。原地转动一次和滚动一次时间都是1秒。另外轮子有4个方向,上北下南左西又东。
另外给你n*m个格子,有些格子不能到达,用#表示,给你起点S和终点T。在起点时轮子方向规定向北,绿色着地,然后滚动到终点,要求绿色着地,但是方向不做要求,问能不能做到,能的话输出最小时间
另外给你n*m个格子,有些格子不能到达,用#表示,给你起点S和终点T。在起点时轮子方向规定向北,绿色着地,然后滚动到终点,要求绿色着地,但是方向不做要求,问能不能做到,能的话输出最小时间
#include<cstdio> #include<queue> #include<iostream> #include<algorithm> #include<cstring> #include<string> using namespace std; char a[30][30]; int vis[30][30][4][5]; int n,m; int dx[4]={-1,0,1,0}; int dy[4]={0,1,0,-1}; struct node { int x,y,di,co,t; node(int xx, int yy, int d, int c, int st) { x = xx; y = yy; di = d; co = c; t = st; } }; queue<node> q; void bfs() { while(!q.empty()) { node u = q.front(); q.pop(); if(a[u.x][u.y] == 'T' && u.co==0) { printf("minimum time = %d sec\n",u.t); return; } int x=u.x; int y=u.y; int co=u.co; //turn right int di=(u.di+1)%4; if(!vis[x][y][di][co]) { vis[x][y][di][co] = 1; q.push(node(x,y,di,co,u.t+1)); } //turn right di=(u.di+3)%4; if(!vis[x][y][di][co]) { vis[x][y][di][co] = 1; q.push(node(x,y,di,co,u.t+1)); } di = u.di; x += dx[di]; y += dy[di]; co = (co+1)%5; if(x<n&&x>=0&&y<m&&y>=0&&a[x][y]!='#'&&!vis[x][y][di][co]) { q.push(node(x,y,di,co,u.t+1)); vis[x][y][di][co] = 1; } } printf("destination not reachable\n"); } int main() { int ss = 1; while(scanf("%d%d", &n, &m) &&n &&m) { if(ss>1) printf("\n"); memset(vis, 0, sizeof(vis)); while(!q.empty()) { q.pop(); } for(int i=0; i<n; i++) { for(int j=0; j<m; j++) { cin>>a[i][j]; if(a[i][j]=='S') { q.push(node(i,j,0,0,0)); vis[i][j][0][0]=1; } } } printf("Case #%d\n",ss++); bfs(); } return 0; }