洛谷P1117 棋盘游戏
2015-10-08 11:11
302 查看
洛谷1117 棋盘游戏
题目描述
在一个4*4的棋盘上有8个黑棋和8个白棋,当且仅当两个格子有公共边,这两个格子上的棋是相邻的。移动棋子的规则是交换相邻两个棋子。现在给出一个初始棋盘和一个最终棋盘,要求你找出一个最短的移动序列使初始棋盘变为最终棋盘。
Klux说:“这么简单的题目,我都会做!”
输入输出格式
输入格式:
第1到4行每行四个数字(1或者0),描述了初始棋盘
接着是一个空行
第6到9行每行四个数字,描述了最终棋盘
输出格式:
输出文件的只有一行是一个整数n,表示最少的移动步数。
输入输出样例
输入样例#1:
1111
0000
1110
0010
1010
0101
1010
0101
输出样例#1:
4
【思路】
宽搜+位运算。
由于要求最小步数可以看出BFS的基本框架,但是如果用矩阵存储状态的话太耗费空间而且很慢,注意到每个格子的状态非0即1而且总格子数目为16所以可以用二进制的方法存储状态,相应判断,转移,判重。
详见代码。
【代码】
另外STL的queue一定程度上的减慢速度,可以用d[][2]数组代替。
题目描述
在一个4*4的棋盘上有8个黑棋和8个白棋,当且仅当两个格子有公共边,这两个格子上的棋是相邻的。移动棋子的规则是交换相邻两个棋子。现在给出一个初始棋盘和一个最终棋盘,要求你找出一个最短的移动序列使初始棋盘变为最终棋盘。
Klux说:“这么简单的题目,我都会做!”
输入输出格式
输入格式:
第1到4行每行四个数字(1或者0),描述了初始棋盘
接着是一个空行
第6到9行每行四个数字,描述了最终棋盘
输出格式:
输出文件的只有一行是一个整数n,表示最少的移动步数。
输入输出样例
输入样例#1:
1111
0000
1110
0010
1010
0101
1010
0101
输出样例#1:
4
【思路】
宽搜+位运算。
由于要求最小步数可以看出BFS的基本框架,但是如果用矩阵存储状态的话太耗费空间而且很慢,注意到每个格子的状态非0即1而且总格子数目为16所以可以用二进制的方法存储状态,相应判断,转移,判重。
详见代码。
【代码】
#include<iostream> #include<queue> #define FOR(a,b,c) for(int a=(b);a<(c);a++) using namespace std; const int maxn = 16; struct Node{ int num,d; }; int A,B; int vis[100000]; void BFS() { queue<Node> q; q.push((Node){A,0}); while(!q.empty()) { Node u=q.front(); q.pop(); int tmp=u.num; if(tmp==B) { cout<<u.d; return ; } for(int i=15;i>=0;i--) { int x=(15-i)/4,y=(15-i)%4,w=1<<i,z; if(y<3 && (tmp&(1<<i))!=(tmp&(1<<i-1))) { z=1<<i-1; if(!vis[tmp^z^w]) { vis[tmp^z^w]=1; q.push((Node){tmp^z^w,u.d+1}); } } if(x<3 && (tmp&(1<<i))!=(tmp&(1<<i-4))) { z=1<<i-4; if(!vis[tmp^z^w]) { vis[tmp^z^w]=1; q.push((Node){tmp^z^w,u.d+1}); } } } } } int main() { ios::sync_with_stdio(false); char c; for(int i=15;i>=0;i--) { cin>>c; if(c!='0') A += 1<<i; } for(int i=15;i>=0;i--) { cin>>c; if(c!='0') B += 1<<i; } if(A==B) cout<<0; else BFS(); }
另外STL的queue一定程度上的减慢速度,可以用d[][2]数组代替。
相关文章推荐
- 软件测试目的
- 软件测试常用术语
- Unix高级编程1-5 pid
- 连接池分析 pooling
- 第一阶段课程感悟
- Android中startActivity中的permission检测与UID机制
- javascript中十进制转十六进制代码
- 安卓6.0的特性
- 大型网站架构模式
- Mysql备份还原数据库之mysqldump实例及参数详细说明
- WPF+AE
- 读《从0到1》有感
- 从github上引入包到eclipse
- java实现socket客户端连接服务端
- No Dialect mapping for JDBC type 错误分析
- IntelliJ IDEA PK Eclipse,孰胜孰负?
- android 常见分辨率(mdpi、hdpi 、xhdpi、xxhdpi )及屏幕适配注意事项
- iOS开发- 三步快速集成社交化分享工具ShareSDK
- ubuntu14.04上安装Java
- 20135304刘世鹏——信息安全系统设计基础第三周学习总结