• 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 } 
  • 相关阅读:
    Sqlite EF6注册
    C# 等值锁定
    net 4.0+EF6+Sqlite 使用,安装,打包
    C#调用C++函数
    C# 调用.exe文件
    Java继承
    python多线程与threading模块
    Java对象构造
    python多线程与_thread模块
    Linux文件压缩与打包
  • 原文地址:https://www.cnblogs.com/cfhome/p/2693106.html
Copyright © 2020-2023  润新知