描述:才用bfs和优先队列就可以了,就是从起点走到终点,只不过起点与终点时与地面接触的颜色相同罢了,不过还要用到四维数组了,然后就可以AC了
代码一:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
using namespace std;
struct Graphs
{
int x,y,time,direction,color;
friend bool operator < (const Graphs &p1,const Graphs &p2)
{
return p1.time>p2.time;
}
};
int n,m,S_x,S_y,flag,count;
priority_queue <Graphs> que;
int num[30][30][5][6];
char str[30][30];
int num_add[4][2]= {{-1,0},{0,-1},{1,0},{0,1}};
void bfs()
{
memset(num,0,sizeof(num));
Graphs g;
g.x=S_x;
g.y=S_y;
flag=g.time=g.direction=g.color=0;
num[S_x][S_y][0][0]=1;
while(!que.empty()) que.pop();
que.push(g);
while(!que.empty())
{
Graphs p=que.top();
que.pop();
for(int i=0; i<4; i++)
{
Graphs q=p;
if(q.direction-i==0)
{
q.time++;
q.color=(q.color+1)%5;
q.x+=num_add[i][0];
q.y+=num_add[i][1];
}
else if(q.direction-i==2||q.direction-i==-2) q.time+=2;
else q.time+=1;
q.direction=i;
if(q.x>=0&&q.x<n&&q.y<m&&q.y>=0&&str[q.x][q.y]!='#'&&!num[q.x][q.y][q.direction][q.color])
{
if(str[q.x][q.y]=='T'&&!q.color)
{
printf("minimum time = %d sec\n",q.time);
return;
}
num[q.x][q.y][q.direction][q.color]=1;
que.push(q);
}
}
}
printf("destination not reachable\n");
}
int main()
{
//freopen("a.txt","r",stdin);
int k(1);
while(scanf("%d%d",&n,&m)!=EOF)
{
if(!n&&!m) break;
memset(str,0,sizeof(str));
for(int i=0; i<n; i++)
{
getchar();
for(int j=0; j<m; j++)
{
scanf("%c",&str[i][j]);
if(str[i][j]=='S')
{
S_x=i;
S_y=j;
}
}
}
if(k>=2) printf("\n");
printf("Case #%d\n",k++);
bfs();
}
return 0;
}
代码二:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
#include <algorithm>
#include <cstdlib>
using namespace std;
struct Graphs
{
int x,y,time,direction,color;
};
int cmp(const void *p1,const void *p2)
{
return ((Graphs *)p1)->time-((Graphs *)p2)->time;
}
int n,m,S_x,S_y,flag,count,last,first;
Graphs g[100010];
int num[30][30][5][6];
char str[30][30];
int num_add[4][2]= {{-1,0},{0,-1},{1,0},{0,1}};
void bfs()
{
memset(num,0,sizeof(num));
g[0].x=S_x;
g[0].y=S_y;
flag=g[0].time=g[0].direction=g[0].color=first=0;
num[S_x][S_y][0][0]=last=1;
while(first<last)
{
for(int i=0; i<4; i++)
{
Graphs q=g[first];
if(q.direction-i==0)
{
q.time++;
q.color=(q.color+1)%5;
q.x+=num_add[i][0];
q.y+=num_add[i][1];
}
else if(q.direction-i==2||q.direction-i==-2) q.time+=2;
else q.time+=1;
q.direction=i;
if(q.x>=0&&q.x<n&&q.y<m&&q.y>=0&&str[q.x][q.y]!='#'&&!num[q.x][q.y][q.direction][q.color])
{
if(str[q.x][q.y]=='T'&&!q.color)
{
printf("minimum time = %d sec\n",q.time);
return;
}
num[q.x][q.y][q.direction][q.color]=1;
g[last++]=q;
}
}
first++;
qsort(g+first,last-first,sizeof(Graphs),cmp);
}
printf("destination not reachable\n");
}
int main()
{
//freopen("a.txt","r",stdin);
int k(1);
while(scanf("%d%d",&n,&m)!=EOF)
{
if(!n&&!m) break;
memset(str,0,sizeof(str));
for(int i=0; i<n; i++)
{
getchar();
for(int j=0; j<m; j++)
{
scanf("%c",&str[i][j]);
if(str[i][j]=='S')
{
S_x=i;
S_y=j;
}
}
}
if(k>=2) printf("\n");
printf("Case #%d\n",k++);
bfs();
}
return 0;
}
10047 - The Monocycle
最新推荐文章于 2019-07-09 00:52:26 发布