P1379 八数码naive题,STL的胜利

八数码:我使用了map判重

结果一遍就轻松A题了。

关于map的用法:

①创建一个map

map<char,int>m;

map<string,long long int>m1;

很浅显。。。

②插入

m.insert(make_pair(19260817,"naive"));

m['R']=3;

③判重

我们只需让出现过的key的value值为1/true

那么是否出现过就是:if(m[2])

///

掌握了map的用法之后八数码就很ok了。

基本思想是广搜。我用字符串+结构体表示状态,写了4个函数为上下左右(其实没必要),以及一个check函数。然后就很显然了:

  1 #include <cstdio>
  2 #include <map>
  3 #include <iostream>
  4 #include <cstring>
  5 #include <queue>
  6 #include <algorithm>
  7 using namespace std;
  8 map<string,int>m;
  9 
 10 struct Node
 11 {
 12     string ss;
 13     int k;
 14 };
 15 
 16 queue<Node>p;
 17 string aim="123804765";
 18 
 19 void check(Node s)
 20 {
 21     if(s.ss==aim)
 22     {
 23         printf("%d",s.k+1);
 24         exit(0);
 25     }
 26     return;
 27 }
 28 
 29 void up(Node s)
 30 {
 31     int i;
 32     for(i=0;i<=8;i++) if(s.ss[i]=='0') break;
 33     if(i<3) return;
 34     //printf("up:i=%d ",i);cout<<s.ss;
 35     swap(s.ss[i],s.ss[i-3]);
 36     //cout<<' '<<s.ss<<endl;
 37     check(s);
 38     if(m[s.ss]) return;
 39     m[s.ss]=1;
 40     s.k++;
 41     p.push(s);
 42     return;
 43 }
 44 void down(Node s)
 45 {
 46     int i;
 47     for(i=0;i<=8;i++) if(s.ss[i]=='0') break;
 48     if(i>5) return;
 49     swap(s.ss[i],s.ss[i+3]);
 50     check(s);
 51     if(m[s.ss]) return;
 52     m[s.ss]=1;
 53     s.k++;
 54     p.push(s);
 55     return;
 56 }
 57 void left(Node s)
 58 {
 59     int i;
 60     for(i=0;i<=8;i++) if(s.ss[i]=='0') break;
 61     if(i==0||i==3||i==6) return;
 62     swap(s.ss[i],s.ss[i-1]);
 63     check(s);
 64     if(m[s.ss]) return;
 65     m[s.ss]=1;
 66     s.k++;
 67     p.push(s);
 68     return;
 69 }
 70 void right(Node s)
 71 {
 72     int i;
 73     for(i=0;i<=8;i++) if(s.ss[i]=='0') break;
 74     if(i==2||i==5||i==8) return;
 75     swap(s.ss[i],s.ss[i+1]);
 76     check(s);
 77     if(m[s.ss]) return;
 78     m[s.ss]=1;
 79     s.k++;
 80     p.push(s);
 81     return;
 82 }
 83 void bfs()
 84 {
 85     while(!p.empty())
 86     {
 87         Node s=p.front();
 88         p.pop();///取点
 89         //cout<<s.ss<<endl;
 90         up(s);
 91         down(s);
 92         left(s);
 93         right(s);
 94     }
 95     return;
 96 }
 97 
 98 int main()
 99 {
100     string c;
101     cin>>c;
102     if(c==aim)
103     {
104         printf("0");
105         return 0;
106     }
107     m.insert(make_pair(c,1));
108     Node a;
109     a.ss=c;
110     a.k=0;
111     p.push(a);
112     bfs();
113     return 0;
114 }
AC代码如下:

 

posted @ 2018-03-28 13:00  huyufeifei  阅读(166)  评论(1编辑  收藏  举报
试着放一个广告栏(虽然没有一分钱广告费)

『Flyable Heart 応援中!』 HHG 高苗京铃 闪十PSS 双六 電動伝奇堂 章鱼罐头制作组 はきか 祝姬 星降夜