【BFS】bzoj1054 [HAOI2008]移动玩具

暴搜吧,可以哈希一下,但是懒得写哈希了,所以慢得要死。

Code:

 1 #include<cstdio>
 2 #include<queue>
 3 #include<set>
 4 #include<algorithm>
 5 using namespace std;
 6 const int di[]={0,0,-1,1},dj[]={-1,1,0,0};
 7 struct Squ{char S[4][4];};
 8 struct Node{Squ v;int d;Node(const Squ &a,const int &b){v=a;d=b;}Node(){}};
 9 bool operator < (const Squ &a,const Squ &b)
10 {
11     for(int i=0;i<4;i++)
12       for(int j=0;j<4;j++)
13         if(a.S[i][j]<b.S[i][j])
14           return true;
15         else if(a.S[i][j]>b.S[i][j])
16           return false;
17     return false;
18 }
19 bool operator == (const Squ &a,const Squ &b)
20 {
21     for(int i=0;i<4;i++)
22       for(int j=0;j<4;j++)
23         if(a.S[i][j]!=b.S[i][j])
24           return false;
25     return true;
26 }
27 Squ from,to;
28 set<Squ>Set;
29 queue<Node>q;
30 inline bool check(const int &x,const int &y)
31 {
32     if(x>=0&&x<4&&y>=0&&y<4&&q.front().v.S[x][y]==0)
33       return true;
34     return false;
35 }
36 inline void work(const Squ &tmp)
37 {
38     if(Set.find(tmp)==Set.end())
39       {
40           if(tmp==to)
41             {
42                 printf("%d\n",q.front().d+1);
43                 exit(0);
44             }
45           Set.insert(tmp);
46           q.push(Node(tmp,q.front().d+1));
47       }
48 }
49 int main()
50 {
51     for(int i=0;i<4;i++)scanf("%s",from.S[i]);
52     for(int i=0;i<4;i++)scanf("%s",to.S[i]);
53     if(from==to){printf("0\n");return 0;}
54     q.push(Node(from,0));
55     Set.insert(from);
56     while(!q.empty())
57       {
58           for(int i=0;i<4;i++)
59             for(int j=0;j<4;j++)
60               if(q.front().v.S[i][j]==1)
61                 {
62                     for(int k=0;k<4;k++)
63                       {
64                           int ti=i+di[k],tj=j+dj[k];
65                           if(check(ti,tj))
66                             {
67                                 Squ tmp=q.front().v;
68                                 swap(tmp.S[i][j],tmp.S[ti][tj]);
69                                 work(tmp);
70                             }
71                       }
72                 }
73           q.pop();
74       }
75     return 0;
76 }

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。