当前位置 : 主页 > 手机开发 > 无线 >

[HAOI2008]移动玩具

来源:互联网 收集:自由互联 发布时间:2021-06-10
[Time Gate] https://www.luogu.org/problemnew/show/P4289 【解题思路】 这是一道很不错的题目 15 int x[ 24]={ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 0, 1, 2, 4, 5, 6, 8, 9, 10 }; 16 int y[ 24]={ 1, 2, 3, 7, 5, 6, 7, 1

[Time Gate]

https://www.luogu.org/problemnew/show/P4289

【解题思路】

这是一道很不错的题目

15 int x[24]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,0,1,2,4,5,6,8,9,10}; 16 int y[24]={1,2,3,7,5,6,7,11,9,10,11,15,13,14,15,4,5,6,8,9,10,12,13,14};
用x,y数组来记录可以发生的移动,如从0号格子可以跳到一号和4号,互相对应的
这是一个很重要的点

再进行广搜啦可利用map映射更加的方便,记录位置对应步数

注意如果交换后该状态的字符串已存在则不必再次搜索(即为第42行代码)
如果交换后该状态的字符串已存在则不必再次搜索(即为第42行代码)

【code】

 1 //
 2 //  main.cpp
 3 //  magicsquare
 4 //
 5 //  Created by dongzhenbo on 2019/7/9.
 6 //  Copyright © 2019 dongzhenbo. All rights reserved.
 7 //
 8 
 9 #include <iostream>
10 #include <map>
11 #include <queue>
12 #include <cstdio>
13 #include <algorithm>
14 using namespace std;
15 int x[24]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,0,1,2,4,5,6,8,9,10};
16 int y[24]={1,2,3,7,5,6,7,11,9,10,11,15,13,14,15,4,5,6,8,9,10,12,13,14};
17 map <string,int> m;
18 queue <string> q;
19 int main(){
20     string s,a,b;
21     for(int i=0;i<=3;i++){
22         cin>>s;
23         a+=s;
24     }
25     for(int i=0;i<=3;i++){
26         cin>>s;
27         b+=s;
28     }
29     m[a]=0;
30     q.push(a);
31     while(!q.empty()){
32         string c=q.front();
33         q.pop();
34         if(c==b){
35             cout<<m[c];
36             return 0;
37         }
38         for(int i=0;i<24;i++){
39                 string d=c;
40                 if(d[x[i]]==d[y[i]])continue;
41                 swap(d[x[i]],d[y[i]]);
42                 if(m[d])continue;
43                 q.push(d);
44                 m[d]=m[c]+1;
45         }
46     }
47 }
网友评论