HDU 1252 Hike on a Graph 题目读懂就能做

来源:互联网 发布:rar64解压软件下载 编辑:程序博客网 时间:2024/06/06 17:50

题目:本人英语有障碍,没办法。。。。。。

有n个点,每两个点之间都有一条边链接,每一条边都有一个颜色,而且会有一个点自己到自己的边,问最短步数可以使得三个点走到一起,走一步的条件是:a,b,c三个点如果从a点到一个点i,那么a到i的这条路的颜色必须与b到c的那条路颜色相同。


想法:直接bfs,开一个结构体记录三个点的位置,和到达当前状态的步数,就非常简单。主要是读懂题。


#include<iostream>#include<cstring>#include<cstdio>#include<queue>using namespace std;char color[55][55];int n,a,b,c;struct node{    int a,b,c;    int step;};int vis[55][55][55];void bfs(){    queue<node>q;    while(!q.empty()) q.pop();    memset(vis,0,sizeof(vis));    node head,nxt;    head.a=a;head.b=b;head.c=c;head.step=0;    vis[a][b][c]=1;    q.push(head);    while(!q.empty())    {        head=q.front();        q.pop();        if(head.a==head.b&&head.b==head.c)        {            printf("%d\n",head.step);            return;        }        for(int i=1;i<=n;i++)        {            nxt=head;            if(color[nxt.a][i]==color[nxt.b][nxt.c])            {                nxt.step++;                nxt.a=i;                if(!vis[nxt.a][nxt.b][nxt.c])                {                    vis[nxt.a][nxt.b][nxt.c]=1;                    q.push(nxt);                }            }        }        for(int i=1;i<=n;i++)        {            nxt=head;            if(color[nxt.b][i]==color[nxt.a][nxt.c])            {                nxt.step++;                nxt.b=i;                if(!vis[nxt.a][nxt.b][nxt.c])                {                    vis[nxt.a][nxt.b][nxt.c]=1;                    q.push(nxt);                }            }        }        for(int i=1;i<=n;i++)        {            nxt=head;            if(color[nxt.c][i]==color[nxt.a][nxt.b])            {                nxt.step++;                nxt.c=i;                if(!vis[nxt.a][nxt.b][nxt.c])                {                    vis[nxt.a][nxt.b][nxt.c]=1;                    q.push(nxt);                }            }        }    }    printf("impossible\n");    return;}int main(){    while(~scanf("%d",&n),n)    {        scanf("%d%d%d",&a,&b,&c);        char s[2];        for(int i=1;i<=n;i++)        {            for(int j=1;j<=n;j++)            {                scanf("%s",s);                color[i][j]=s[0];            }        }        bfs();    }    return 0;}

0 0
原创粉丝点击