sicily 简单魔板

这道题用宽搜把从开始状态往下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 } 

 

posted @ 2012-09-19 09:01  晨风世界  阅读(143)  评论(0编辑  收藏  举报