• USACO 3.2 msquare 裸BFS


    又是个裸BFS...

    和西安网赛那道1006一样的,只不过加上了要记录方案。顺便复习map

    记录方案直接在bfs队列的结点里加一个vector<int> opt,把从开头一直到当前结点的操作序列记下来

      1 /*
      2 PROB:msquare
      3 LANG:C++
      4 */
      5 
      6 #include <iostream>
      7 #include <vector>
      8 #include <algorithm>
      9 #include <map>
     10 #include <queue>
     11 #include <cstdio>
     12 using namespace std;
     13 
     14 struct node
     15 {
     16     vector<int> seq;
     17     int step;
     18     vector<int> opt;
     19     node(vector<int> x,int m,vector<int> o,int op):seq(x),step(m),opt(o)
     20     {
     21         opt.push_back(op);
     22     }
     23 };
     24 
     25 map<vector<int>,int> M;
     26 queue<node> Q;
     27 vector<int> a;      //tmp2
     28 vector<int> A;      //init
     29 vector<int> y;      //tmp1
     30 vector<int> B;      //goal
     31 vector<int> ans;
     32 vector<int> yy;
     33 int b[10];
     34 
     35 bool same()
     36 {
     37     for (int i=0;i<8;i++)
     38         if (y[i]!=b[i])
     39             return false;
     40     return true;
     41 }
     42 
     43 int main()
     44 {
     45     freopen("msquare.in","r",stdin);
     46     freopen("msquare.out","w",stdout);
     47 
     48     B.clear();
     49     a.clear();
     50     A.clear();
     51     for (int i=0;i<=3;i++)
     52     {
     53         cin>>b[i];
     54         A.push_back(i+1);
     55     }
     56     for (int i=7;i>=4;i--)
     57     {
     58         cin>>b[i];
     59         A.push_back(i+1);
     60     }
     61     for (int i=0;i<8;i++)
     62         B.push_back(b[i]);
     63 
     64     //for (int i=0;i<8;i++)
     65     //    cout<<B[i]<<" "<<A[i]<<endl;
     66 
     67     //A[0]=1;     A[1]=2;     A[2]=3;     A[3]=4;
     68     //A[4]=8;     A[5]=7;     A[6]=6;     A[7]=5;
     69     Q.push(node(A,0,a,0));
     70     M.insert(pair<vector<int>,int>(A,1));
     71     while (!Q.empty())
     72     {
     73         node tmp=Q.front();
     74         Q.pop();
     75         int st=tmp.step;
     76         //cout<<"step  "<<st<<endl;
     77         y=tmp.seq;
     78         yy=tmp.opt;
     79         if (same())
     80         {
     81             ans.clear();
     82             ans=tmp.opt;
     83             cout<<st<<endl;
     84             for (int i=1;i<=st;i++)
     85             {
     86                 char ch=ans[i]+'A'-1;
     87                 cout<<ch;
     88             }
     89             cout<<endl;
     90             break;
     91         }
     92         else
     93         {
     94             //opr1
     95             a=y;
     96             swap(a[0],a[4]);
     97             swap(a[1],a[5]);
     98             swap(a[2],a[6]);
     99             swap(a[3],a[7]);
    100             if (!M.count(a))
    101             {
    102                 M.insert(pair<vector<int>,int>(a,1));
    103                 Q.push(node(a,st+1,yy,1));
    104             }
    105             //opr2
    106             a=y;
    107             int t1=a[3],t2=a[7];
    108             a[3]=a[2];  a[7]=a[6];
    109             a[2]=a[1];  a[6]=a[5];
    110             a[1]=a[0];  a[5]=a[4];
    111             a[0]=t1;    a[4]=t2;
    112             if (!M.count(a))
    113             {
    114                 M.insert(pair<vector<int>,int>(a,1));
    115                 Q.push(node(a,st+1,yy,2));
    116             }
    117             //opr3
    118             a=y;
    119             int tm=a[1];
    120             a[1]=a[5];  a[5]=a[6];  a[6]=a[2];  a[2]=tm;
    121             if (!M.count(a))
    122             {
    123                 M.insert(pair<vector<int>,int>(a,1));
    124                 Q.push(node(a,st+1,yy,3));
    125             }
    126         }
    127     }
    128 
    129     return 0;
    130 }
    View Code
  • 相关阅读:
    图像增强:直方图均衡和小波变换【matlab】
    边缘检测算子和小波变换提取图像边缘【matlab】
    维纳滤波和编码曝光PSF去除运动模糊【matlab】
    编码曝光
    鱼眼镜头的distortion校正【matlab】
    Linux如何查看JDK的安装路径
    Linux启动vi编辑器时提示E325: ATTENTION解决方案
    Linux下useradd命令创建的用户不能登录的问题
    Linux系统下(x64)安装jdk 1.6(jdk-6u45-linux-x64.bin)
    根据wsdl文件,Web工程自动生成webservice客户端调用
  • 原文地址:https://www.cnblogs.com/pdev/p/4032031.html
Copyright © 2020-2023  润新知