hdu 1252

来源:互联网 发布:windows高级选项菜单 编辑:程序博客网 时间:2024/06/02 07:01

#include<cstdio>#include<cstring>#include<queue>using namespace std;const int maxn = 50 + 5;int n;struct node{    int p1, p2, p3, step;} point;int go[maxn][maxn];int get_id(){    char ch;    for(;;)    {        scanf("%c", &ch);        if(ch >= 'a' && ch <= 'z') break;    }    return ch - 'a' + 1;}int vis[maxn][maxn][maxn];int check(node x){    if(x.p1 == x.p2 && x.p1 == x.p3) return true;    return false;}int bfs(){    point.p1--; point.p2--; point.p3--;    if(point.p1 == point.p2 && point.p1 == point.p3) return 0;    memset(vis, 0, sizeof(vis));    vis[point.p1][point.p2][point.p3] = 1;    point.step = 0;    queue<node> q;    q.push(point);    while(!q.empty())    {        node sq = q.front();        //printf("%d %d %d\n", sq.p1, sq.p2, sq.p3);        q.pop();        sq.step++;        node tq = sq;        for(int i = 0; i < n; i++)        {            for(int j = 0; j < n; j++)                if(i != j && go[i][j])                {                    if(tq.p1 == i && !vis[j][tq.p2][tq.p3] && go[i][j] == go[tq.p2][tq.p3])                    {                        tq.p1 = j;                        vis[tq.p1][tq.p2][tq.p3] = 1;                        if(check(tq)) return tq.step;                        q.push(tq);                        tq = sq;                    }                    if(tq.p2 == i && !vis[tq.p1][j][tq.p3] && go[i][j] == go[tq.p1][tq.p3])                    {                        tq.p2 = j;                        vis[tq.p1][tq.p2][tq.p3] = 1;                        if(check(tq)) return tq.step;                        q.push(tq);                        tq = sq;                    }                    if(tq.p3 == i && !vis[tq.p1][tq.p2][j] && go[i][j] == go[tq.p1][tq.p2])                    {                        tq.p3 = j;                        vis[tq.p1][tq.p2][tq.p3] = 1;                        if(check(tq)) return tq.step;                        q.push(tq);                        tq = sq;                    }                }        }    }    return -1;}void print(){    for(int i = 0; i < n; i++)    {        for(int j = 0; j < n; j++)        {            printf("%d ", go[i][j]);        }        printf("\n");    }}int main(){    while(scanf("%d", &n) == 1 && n)    {        memset(go, 0, sizeof(go));        scanf("%d%d%d", &point.p1, &point.p2, &point.p3);        for(int i = 0; i < n; i++)            for(int j = 0; j < n; j++)            {                int id = get_id();                go[i][j] = id;            }        //print();        int t = bfs();        if(t < 0) printf("impossible\n");        else printf("%d\n", t);    }    return 0;}

理解题意特别重要!!!!!!!!!!!!

题意大致是有p1, p2, p3三个东西,判断p1 -> a是否可行, 只要 p2 与 p3路径颜色与p1和a一样就行,接下来机械式的bfs就行

上代码