博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【HDOJ】1401 Solitaire
阅读量:6643 次
发布时间:2019-06-25

本文共 2894 字,大约阅读时间需要 9 分钟。

双向BFS+状态压缩。

1 /* 1401 */  2 #include 
3 #include
4 #include
5 #include
6 #include
7 #include
8 #include
9 using namespace std; 10 11 struct Point_t{ 12 char x, y; 13 friend bool operator ==(const Point_t &a, const Point_t &b) { 14 return a.x==b.x && a.y==b.y; 15 } 16 }; 17 18 typedef struct Node_t { 19 Point_t p[4]; 20 int t; 21 } Node_t; 22 23 const char n = 8; 24 Node_t b1, b2; 25 map
tb; 26 char dir[4][2] = { 27 -1,0,1,0,0,-1,0,1 28 }; 29 30 bool comp(const Point_t &a, const Point_t &b) { 31 if (a.x == b.x) 32 return a.y < b.y; 33 return a.x < b.x; 34 } 35 36 int calHash(Node_t nd) { 37 int ret = 0; 38 int i, j; 39 40 for (i=0,j=0; i<4; ++i,j+=6) { 41 ret |= (nd.p[i].x << j); 42 ret |= (nd.p[i].y << (j+3)); 43 } 44 return ret; 45 } 46 47 bool judge(Node_t &nd, int v, int d) { 48 int i, j, k; 49 50 nd.p[v].x += dir[d][0]; 51 nd.p[v].y += dir[d][1]; 52 53 if (nd.p[v].x<=0 || nd.p[v].x>n || nd.p[v].y<=0 || nd.p[v].y>n) 54 return false; 55 56 for (i=0; i<4; ++i) { 57 if (i != v) { 58 if (nd.p[i] == nd.p[v]) { 59 // jump over one piece 60 nd.p[v].x += dir[d][0]; 61 nd.p[v].y += dir[d][1]; 62 if (nd.p[v].x<=0 || nd.p[v].x>n || nd.p[v].y<=0 || nd.p[v].y>n) 63 return false; 64 for (j=0; j<4; ++j) 65 if (j!=v && nd.p[j]==nd.p[v]) 66 return false; 67 break; 68 } 69 } 70 } 71 72 sort(nd.p, nd.p+4, comp); 73 return true; 74 } 75 76 int bfs() { 77 int i, j, k; 78 queue
Q1, Q2; 79 Node_t nd, tmp; 80 81 sort(b1.p, b1.p+4, comp); 82 sort(b2.p, b2.p+4, comp); 83 Q1.push(b1); 84 Q2.push(b2); 85 tb[calHash(b1)] = 1; 86 tb[calHash(b2)] = 2; 87 88 while (!Q1.empty() || !Q2.empty()) { 89 if (!Q1.empty()) { 90 nd = Q1.front(); 91 Q1.pop(); 92 if (nd.t < 4) { 93 tmp = nd; 94 ++tmp.t; 95 for (i=0; i<4; ++i) { 96 for (j=0; j<4; ++j) { 97 nd = tmp; 98 if (judge(nd, i, j)) { 99 k = calHash(nd);100 if (tb[k] == 2)101 return 1;102 if (tb[k] != 1) {103 Q1.push(nd);104 tb[k] = 1;105 }106 }107 }108 }109 }110 }111 if (!Q2.empty()) {112 nd = Q2.front();113 Q2.pop();114 if (nd.t < 4) {115 tmp = nd;116 ++tmp.t;117 for (i=0; i<4; ++i) {118 for (j=0; j<4; ++j) {119 nd = tmp;120 if (judge(nd, i, j)) {121 k = calHash(nd);122 if (tb[k] == 1)123 return 1;124 if (tb[k] != 2) {125 Q2.push(nd);126 tb[k] = 2;127 }128 }129 }130 }131 }132 }133 }134 135 return 0;136 }137 138 int main() {139 int i, j, k;140 141 #ifndef ONLINE_JUDGE142 freopen("data.in", "r", stdin);143 freopen("data.out", "w", stdout);144 #endif145 146 b1.t = b2.t = 0;147 while (scanf("%d %d", &b1.p[0].x, &b1.p[0].y) != EOF) {148 for (i=1; i<4; ++i)149 scanf("%d %d", &b1.p[i].x, &b1.p[i].y);150 for (i=0; i<4; ++i)151 scanf("%d %d", &b2.p[i].x, &b2.p[i].y);152 tb.clear();153 k = bfs();154 if (k)155 puts("YES");156 else157 puts("NO");158 }159 160 return 0;161 }

 

转载于:https://www.cnblogs.com/bombe1013/p/4296589.html

你可能感兴趣的文章
Java Socket基础(二)
查看>>
Xamarin XAML语言教程Xamarin.Forms中改变活动指示器颜色
查看>>
Jenkins Master/Slave架构
查看>>
Linux Shell 程序调试
查看>>
Oracle Dimension
查看>>
使用客户端登陆ftp 500 OOPS: cannot change directory:/root
查看>>
docker 私用仓库Harbor搭建及配置
查看>>
理解HTTP协议
查看>>
巧用分类信息做网站的口碑推广
查看>>
理解并取证:ICMPV6代替IPV4中的ARP进行IPv6的MAC地址解析
查看>>
数据库知识体系梳理(一)
查看>>
我的友情链接
查看>>
一个很酷的加载loading效果
查看>>
Java解析json串
查看>>
光照模型与面绘制算法---OpenGL光照和表面绘制函数
查看>>
系统文件的损坏导致Windows XP连续重启的解决方案
查看>>
北京点击科技有限公司董事长兼总裁——王志东经典语录5
查看>>
Linux误删home目录下的用户目录恢复
查看>>
JavaScript中的函数是数据
查看>>
Linux 内核配置选项
查看>>