HDU1195 BFS

题意:从一个4位数到另一个4位数 所需的步数

bfs

View Code
 1 #include<stdio.h>
 2 #include<string>
 3 #include<stdlib.h>
 4 #include<queue>
 5 #include<algorithm>
 6 #include<iostream>
 7 #include<map>
 8 using namespace std;
 9 const int maxn = 10;
10 char a[maxn],b[maxn];
11 int vis[ 100000 ];
12 struct node{
13     char nn[maxn];
14     int t;
15 };
16 
17 int solve( char a,char b,char c, char d ){
18     return (a-'0')*1+(b-'0')*10+(c-'0')*100+(d-'0')*1000;
19 }
20 
21 int bfs(){
22     queue<node>q;
23     while( !q.empty() )
24         q.pop();
25     node now,next;
26     memset( vis,0,sizeof( vis ));
27     strcpy( now.nn,a );//now.nn=a;
28     vis[ solve(a[0],a[1],a[2],a[3]) ]=1;
29     now.t=0;
30     q.push( now );
31     while( !q.empty() ){
32         now=q.front(),q.pop();
33         //printf("now:%s\n",now.nn);
34         if( solve(now.nn[0],now.nn[1],now.nn[2],now.nn[3]) == solve( b[0],b[1],b[2],b[3] ) )
35             return now.t;
36         //next.nn=now.nn;
37         next.t=now.t+1;
38         for( int i=0;i<4;i++ ){
39             strcpy( next.nn,now.nn );//.nn=now.nn;
40             if( next.nn[i]=='9' ){
41                 next.nn[i]='1';
42             }
43             else{
44                 next.nn[i]=now.nn[i]+1;
45             }
46             if( vis[ solve(next.nn[0],next.nn[1],next.nn[2],next.nn[3]) ]==0/*mp[ next.nn ]==0*/ ){
47                 vis[ solve(next.nn[0],next.nn[1],next.nn[2],next.nn[3]) ]=1;
48                 q.push( next );
49             }
50         }//add 1
51         for( int i=0;i<4;i++ ){
52             strcpy( next.nn,now.nn );//next.nn=now.nn;
53             if( next.nn[i]=='1' ){
54                 next.nn[i]='9';
55             }
56             else{
57                 next.nn[i]=now.nn[i]-1;
58             }
59             if( vis[ solve(next.nn[0],next.nn[1],next.nn[2],next.nn[3]) ]==0/*mp[ next.nn ]==0*/ ){
60                 vis[ solve(next.nn[0],next.nn[1],next.nn[2],next.nn[3]) ]=1;
61                 q.push( next );
62             }
63         }
64         char tmp;
65         for( int i=1;i<4;i++ ){
66             strcpy( next.nn,now.nn );//next.nn=now.nn;
67             tmp=now.nn[i];
68             next.nn[i]=now.nn[i-1];
69             next.nn[i-1]=tmp;
70             if( vis[ solve(next.nn[0],next.nn[1],next.nn[2],next.nn[3]) ]==0/*mp[ next.nn ]==0*/ ){
71                 vis[ solve(next.nn[0],next.nn[1],next.nn[2],next.nn[3]) ]=1;
72                 q.push( next );
73             }
74         }
75     }
76     return -1;
77 }
78 
79 int main(){
80     int ca;
81     scanf("%d",&ca);
82     while( ca-- ){
83         scanf("%s%s",a,b);
84         int ans=bfs();
85         printf("%d\n",ans);
86     }
87     return 0;
88 }

 

posted @ 2013-02-16 10:39  xxx0624  阅读(357)  评论(0编辑  收藏  举报