博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
水两道搜索
阅读量:6290 次
发布时间:2019-06-22

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

POJ 1753

BFS位运算

#include 
#include
#include
#include
using namespace std;int map[6][6];int change[16] = { 51200, 58368, 29184, 12544, 35968, 20032, 10016, 4880, 2248, 1252, 626, 305, 140, 78, 39, 19 };int BFS(int state) { queue
> Q; Q.push(make_pair(state, 0)); int tmp; pair
cur; int vis[65536] = { 0 }; while (!Q.empty()) { cur = Q.front(); Q.pop(); for (int i = 0; i < 16; i++) { tmp = cur.first ^ change[i]; if (tmp == 0 || tmp == 65535) return cur.second + 1; if (!vis[tmp]) Q.push(make_pair(tmp, cur.second + 1)), vis[tmp] = 1; } } return -1;}int main() {// freopen("data.txt", "r", stdin); char tmp; while (~scanf("%c", &tmp)) { int state = 0; memset(map, 0, sizeof(map)); map[1][1] = (tmp == 'b') ? 1 : 0; if (map[1][1]) state += 1; for (int i = 1; i < 4; i++) { scanf("%c", &tmp); map[1][i] = (tmp == 'b') ? 1 : 0; if (map[1][i]) state += 1 << i; } for (int i = 2; i <= 4; i++) { getchar(); for (int j = 1; j <= 4; j++) { scanf("%c", &tmp); map[i][j] = (tmp == 'b') ? 1 : 0; if (map[i][j]) state += 1 << ((i - 1) * 4 + j - 1); } } getchar(); if (state == 0 || state == 65535) { puts("0"); continue; } int ans = BFS(state); ans == -1 ? puts("Impossible") : printf("%d\n", ans); } return 0;}

 

POJ 2965

要求输出操作方式,DFS迭代加深。

#include 
#include
using namespace std;int chess;int step;bool flag = 0;int ans[16];int flip[16] = { 0x111f, 0x222f, 0x444f, 0x888f, 0x11f1, 0x22f2, 0x44f4, 0x88f8, 0x1f11, 0x2f22, 0x4f44, 0x8f88, 0xf111, 0xf222, 0xf444, 0xf888 };void dfs(int bit, int deep) { if (deep == step) { flag = (chess == 0) ? 1 : 0; return; } if (flag || bit > 15) return; ans[deep] = bit; chess ^= flip[bit]; dfs(bit + 1, deep + 1); chess ^= flip[bit]; dfs(bit + 1, deep);}int main() {// freopen("data.txt", "r", stdin); char tmp; chess = 0; for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { scanf("%c", &tmp); if (tmp == '+') chess ^= (1 << (i * 4 + j)); } if (i < 3) getchar(); } for (step = 0;; step++) { dfs(0, 0); if (flag) break; } printf("%d\n", step); for (int i = 0; i < step; i++) printf("%d %d\n", ans[i] / 4 + 1, ans[i] % 4 + 1); return 0;}

 

转载于:https://www.cnblogs.com/updateofsimon/p/3608757.html

你可能感兴趣的文章
Spring第一个HelloWorld
查看>>
使用NFS时注意的事项
查看>>
lvs dr
查看>>
如何在Window 10上安装Docker
查看>>
python模块samba
查看>>
Linux 安全配置规范
查看>>
ESXI开启SSH
查看>>
RH124 单元一 Gnome图形桌面使用入门
查看>>
为fastcgi下的php配置共享内存的eAccelerator加速
查看>>
docker 基本操作Ⅱ(关于镜像操作)
查看>>
5.1、Android Studio用Logcat编写和查看日志
查看>>
[BZOJ4785][P3688][ZJOI2017]树状数组[树套树+树状数组]
查看>>
[Hyper-V]给Hyper-V创建两块网卡备用
查看>>
ubuntu 软件安装相关
查看>>
高质量外链的获取途径,你知道几个呢
查看>>
U盘不识别怎么办?
查看>>
我的友情链接
查看>>
Maximum execution time of 30 seconds exceeded解决方案
查看>>
centos6.2 将mysql数据存储位置移动教程
查看>>
无线路由器更换密码之后iphone没有办法链接
查看>>