码迷,mamicode.com
首页 > 其他好文 > 详细

黑白棋游戏(或是叫再破难关)——稍微用了下状态压缩的bfs

时间:2017-07-19 20:34:57      阅读:173      评论:0      收藏:0      [点我收藏+]

标签:getc   closed   src   empty   void   ++   dbf   lib   pen   

  洛谷和CodeVS 上叫做黑白棋游戏,要求输出路径。CodeVS 上没有spj,洛谷上有但是我的输出总是直接报错。最后找到了Vijos 上的再破难关,一样的题,只是不需要输出路径,交了就对了。

技术分享
 1 #include<iostream>
 2 #include<cstring>
 3 #include<cstdlib>
 4 #include<cstdio>
 5 #include<vector>
 6 #include<queue>
 7 using namespace std;
 8 const int xdr[]={4,-4,1,-1},ax[]={-1,1,0,0},ay[]={0,0,-1,1};//上 下 左 右 
 9 struct node{int num,s;};
10 
11 int sx,tx,mark=15,res,code[8][8],cnt,fth[2<<18],mv[2<<18];
12 bool vis[2<<18];
13 
14 void bfs(){
15     queue<node> q;
16     q.push((node){sx,0});
17     vis[sx]=true;
18     fth[sx]=0;
19     
20     while(!q.empty()){
21         int x=q.front().num,s=q.front().s;
22         if(x==tx){
23             cout<<s<<endl;
24             exit(0);
25         }
26         q.pop();
27         
28         
29         for(int i=1;i<=4;i++)
30             for(int j=1;j<=4;j++)
31                 if(x&code[i][j])
32                     for(int k=0;k<4;k++){
33                         if((k==0&&i==1)||(k==1&&i==4)||
34                            (k==2&&j==1)||(k==3&&j==4)||
35                            (x&code[i+ax[k]][j+ay[k]]))
36                             continue;
37                         
38                         int nx=x+code[i+ax[k]][j+ay[k]]-code[i][j];
39                         if(vis[nx])continue;
40                         vis[nx]=true;
41                         
42                         mv[nx]=i*1000+j*100+(i+ax[k])*10+j+ay[k];
43                         
44                         fth[nx]=x;
45                         q.push((node){nx,s+1});
46                         
47                     }
48     }
49 }
50 
51 int main(){
52     for(int i=1;i<=4;i++)
53         for(int j=1;j<=4;j++)
54             code[i][j]=1<<mark--;
55         
56     mark=15;
57     for(int i=1;i<=4;i++){
58         for(int j=1;j<=4;j++){
59             char c=getchar();
60             sx+=(1<<mark)*(c==1);
61             mark--;
62         }
63         getchar();
64     }
65     getchar();
66     mark=15;
67     for(int i=1;i<=4;i++){
68         for(int j=1;j<=4;j++){
69             char c=getchar();
70             tx+=(1<<mark)*(c==1);
71             mark--;
72         }
73         getchar();
74     }
75     mark=0;
76     bfs();
77     return 0;
78 }
Method_01

  Vijos 63ms

黑白棋游戏(或是叫再破难关)——稍微用了下状态压缩的bfs

标签:getc   closed   src   empty   void   ++   dbf   lib   pen   

原文地址:http://www.cnblogs.com/duskfire/p/7207404.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!