您的位置:首页 > 其它

文章标题

2017-03-25 15:50 183 查看
题意:个你一个转轮,有5种颜色,为了5中颜色的位置是确定的,为了方便处理我们用01234来表示绿,黑,红,蓝,白。轮子可以沿着它的方向滚动(只能是它当前的方向不能相反方向),每滚动一次会到达另一个格子,着地的颜色会改变,变了之前颜色的下一个,例如当前是绿色着地下一次就是黑色,依次是红蓝白。也可以原地转动(顺逆时针都可以),原地转动其实就是改变了轮子的滚动方向,原地转动每次能转90度。原地转动一次和滚动一次时间都是1秒。另外轮子有4个方向,上北下南左西又东。

另外给你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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: