hdu-1195--Open the Lock(BFS)

来源:互联网 发布:广数g76车螺纹编程实例 编辑:程序博客网 时间:2024/04/27 20:40

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1195

#include<stdio.h>#include<iostream>#include<string.h>#include<queue>using namespace std;int vis[10][10][10][10];int s[10],s1[10];struct node{    int a,b,c,d,step;};void bfs(){    node p,q;    queue<node> Q;    memset(vis,0,sizeof(vis));    p.a=s[0];p.b=s[1];p.c=s[2];p.d=s[3];    vis[p.a][p.b][p.c][p.d]=1;    p.step=0;    Q.push(p);    while(!Q.empty())    {        q=Q.front();Q.pop();        if(q.a==s1[0]&&q.b==s1[1]&&q.c==s1[2]&&q.d==s1[3])        {            printf("%d\n",p.step-1);            return ;        }        for(int i=0;i<4;i++)//+1        {            if(i==0)            {                if(q.a==9) p.a=1;                else p.a=q.a+1;                p.b=q.b;p.c=q.c;p.d=q.d;            }            else if(i==1)            {                if(q.b==9) p.b=1;                else p.b=q.b+1;                p.a=q.a;p.c=q.c;p.d=q.d;            }            else if(i==2)            {                if(q.c==9) p.c=1;                else p.c=q.c+1;                p.a=q.a;p.b=q.b;p.d=q.d;            }            else            {                if(q.d==9) p.d=1;                else p.d=q.d+1;                p.a=q.a;p.c=q.c;p.b=q.b;            }            if(!vis[p.a][p.b][p.c][p.d])            {                p.step=q.step+1;                vis[p.a][p.b][p.c][p.d]=1;                Q.push(p);            }        }        for(int i=0;i<4;i++)//-1        {            if(i==0)            {                if(q.a==1) p.a=9;                else p.a=q.a-1;                p.b=q.b;p.c=q.c;p.d=q.d;            }            else if(i==1)            {                if(q.b==1) p.b=9;                else p.b=q.b-1;                p.a=q.a;p.c=q.c;p.d=q.d;            }            else if(i==2)            {                if(q.c==1) p.c=9;                else p.c=q.c-1;                p.a=q.a;p.b=q.b;p.d=q.d;            }            else            {                if(q.d==1) p.d=9;                else p.d=q.d-1;                p.a=q.a;p.c=q.c;p.b=q.b;            }            if(!vis[p.a][p.b][p.c][p.d])            {                p.step=q.step+1;                vis[p.a][p.b][p.c][p.d]=1;                Q.push(p);            }        }        for(int i=0;i<3;i++)//两两交换        {            if(i==0)            {                p.a=q.b;p.b=q.a;                p.c=q.c;p.d=q.d;            }            else if(i==1)            {                p.a=q.a;p.b=q.c;                p.c=q.b;p.d=q.d;            }            else            {                p.a=q.a;p.b=q.b;                p.c=q.d;p.d=q.c;            }            if(!vis[p.a][p.b][p.c][p.d])            {                p.step=q.step+1;                vis[p.a][p.b][p.c][p.d]=1;                Q.push(p);            }        }    }    return ;}int main(){    int n;    char c,str[10],str1[11];    cin>>n;    while(n--)    {        cin>>str;        cin>>str1;        for(int i=0;i<4;i++)        s[i]=str[i]-'0';        for(int i=0;i<4;i++)        s1[i]=str1[i]-'0';        scanf("%c",&c);        bfs();    }}


原创粉丝点击