这道题用宽搜把从开始状态往下10层变化的所有结果都找出来存在一个map里面(测试了一下,一共只有10000种情况不会太大),然后再去查找目标的情况是否在map里面,如果不在则说明不行,如果在的话看其从开始的状态变到这里用的步数是否超过了规定的N
宽搜的话用一个队列就可以实现了
1 #include<iostream> 2 #include<map> 3 #include<string> 4 #include<queue> 5 #include<stdio.h> 6 using namespace std; 7 8 string A(string now,string afterA) 9 { 10 afterA[ 0 ] = now[ 4 ]; 11 afterA[ 1 ] = now[ 5 ]; 12 afterA[ 2 ] = now[ 6 ]; 13 afterA[ 3 ] = now[ 7 ]; 14 afterA[ 4 ] = now[ 0 ]; 15 afterA[ 5 ] = now[ 1 ]; 16 afterA[ 6 ] = now[ 2 ]; 17 afterA[ 7 ] = now[ 3 ]; 18 return afterA; 19 } 20 string B(string now,string afterA) 21 { 22 afterA[ 0 ] = now[ 3 ]; 23 afterA[ 1 ] = now[ 0 ]; 24 afterA[ 2 ] = now[ 1 ]; 25 afterA[ 3 ] = now[ 2 ]; 26 afterA[ 4 ] = now[ 7 ]; 27 afterA[ 5 ] = now[ 4 ]; 28 afterA[ 6 ] = now[ 5 ]; 29 afterA[ 7 ] = now[ 6 ]; 30 return afterA; 31 } 32 string C(string now,string afterA) 33 { 34 afterA[ 0 ] = now[ 0 ]; 35 afterA[ 1 ] = now[ 5 ]; 36 afterA[ 2 ] = now[ 1 ]; 37 afterA[ 3 ] = now[ 3 ]; 38 afterA[ 4 ] = now[ 4 ]; 39 afterA[ 5 ] = now[ 6 ]; 40 afterA[ 6 ] = now[ 2 ]; 41 afterA[ 7 ] = now[ 7 ]; 42 return afterA; 43 } 44 map<string,string> m; 45 46 void find() 47 { 48 queue<string> q; 49 string prime="12348765"; 50 m[prime].clear(); 51 q.push(prime); 52 for(int i=0;i<10;i++) 53 { 54 int num=q.size(); 55 string s=prime; 56 while(num--) 57 { 58 string now=q.front(); 59 s=A(now,s); 60 if(m.find(s)==m.end()) //避免重复,如:开始状态12348765,经过AA变换后又成了12348765,此时就不用加入map了,因为要的是最小步数 61 { 62 m[s]=m[now]+'A'; 63 q.push(s); 64 } 65 s=B(now,s); 66 if(m.find(s)==m.end()) 67 { 68 m[s]=m[now]+'B'; 69 q.push(s); 70 } 71 s=C(now,s); 72 if(m.find(s)==m.end()) 73 { 74 m[s]=m[now]+'C'; 75 q.push(s); 76 } 77 q.pop(); 78 } 79 } 80 } 81 int main() 82 { 83 find(); 84 int N; 85 while(cin>>N&&N!=-1) 86 { 87 string goal="12348765";//注意这里一定要初始化,要不下面‘0’+整数得不到char的(我犯了这个错误) 88 int p; 89 for(int i=0;i<8;i++) 90 { 91 scanf("%d",&p); 92 goal[i]='0'+p; 93 } 94 if(m.find(goal)==m.end()||m[goal].size()>N) cout<<-1<<endl; 95 else 96 { 97 cout<<m[goal].size()<<' '<<m[goal]<<endl; 98 } 99 } 100 system("pause"); 101 return 0; 102 }