连连看游戏中的最短路径
来源:互联网 发布:mysql分表 编辑:程序博客网 时间:2024/05/29 17:58
连连看游戏是一个比较简单的游戏,两个相同的点可以消除,但前提是两点之间的路径不能有多于两个折点。如何去求解两个点之间的距离呢?我们可以将这里的距离定义为二元组(x,y),x表示多少次转折,y表示路径长度。x值越小距离越短,相同x值的情况下y值越小距离越短。只要使用BFS就可以了,下面就容易写代码了。
#include <iostream>#include <queue>using namespace std;const int N = 20;int inline getx(int x){ return x & 0xFF;}int inline gety(int x){ return (x >> 8) & 0xFF;}int inline make(int x, int y){ return (x & 0xFF) | ((y & 0xFF) << 8);}bool inline isvalid(int x, int y){ return x >= 0 && y >= 0 && x < N && y < N;}char int2char(int i){ return i < 0 ? ' ' : (i < 10 ? '0' + i : (i < 36 ? 'a' + i - 10 : (i < 62 ? 'A' + i - 36 : '-')));}void print(int map[N][N]){ for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { cout << int2char(getx(map[i][j])-1) << int2char(gety(map[i][j])); if (j != N - 1)cout << '.'; } cout << endl; }}int main(){ static int map[N][N]; static int flg[N][N]; for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { map[i][j] = 0; flg[i][j] = 0; } } map[0][2] = -1; map[1][2] = -1; map[2][3] = -1; map[2][4] = -1; map[3][4] = -1; print(map); cout << "---\r\n\r\n" << endl; queue<int> q; flg[0][0] = 1; q.push(make(0, 0)); while (!q.empty()) { int t = q.front(); int x = getx(t); int y = gety(t); int u = 1, d = 1, l = 1, r = 1; for (int step = 1; step < N; step++) { int dist = make(getx(map[x][y])+1, gety(map[x][y])+step); if (u && isvalid(x,y-step) && flg[x][y-step] == 0) { if (map[x][y-step] != -1) { map[x][y-step] = dist; flg[x][y-step] = 1; q.push(make(x,y-step)); } else { u = 0; } } if (d && isvalid(x,y+step) && flg[x][y+step] == 0) { if (map[x][y+step] != -1) { map[x][y+step] = dist; flg[x][y+step] = 1; q.push(make(x,y+step)); } else { d = 0; } } if (l && isvalid(x-step,y) && flg[x-step][y] == 0) { if (map[x-step][y] != -1) { map[x-step][y] = dist; flg[x-step][y] = 1; q.push(make(x-step,y)); } else { l = 0; } } if (r && isvalid(x+step,y) && flg[x+step][y] == 0) { if (map[x+step][y] != -1) { map[x+step][y] = dist; flg[x+step][y] = 1; q.push(make(x+step,y)); } else { r = 0; } } } q.pop(); } print(map); cout << "finish..." << endl; return 0;}
- 连连看游戏中的最短路径
- 【游戏算法之连连看】我最开始想到的连连看的 消除算法。。。。。
- 【游戏算法之连连看】我最开始想到的连连看的 消除算法。。。。。【补充】
- 连连看游戏
- 连连看游戏分析!
- 连连看游戏
- 连连看游戏笔记
- 连连看游戏
- 连连看游戏设计
- QQ游戏连连看
- 连连看游戏总结
- 连连看游戏设计
- QQ游戏连连看
- oop 连连看游戏
- BFS_连连看游戏
- BFS_连连看游戏
- 【141029】VC游戏编写中的求解最短路径算法源码
- OSPF中的最短路径算法
- html学习笔记
- POJ 1325 ZOJ 1364 最小覆盖点集
- 2013年中秋节放假安排
- android之wifi体系架构源码流程分析
- Socket 注意事项; 要关闭流; 否则报错connection reset;
- 连连看游戏中的最短路径
- 2.10 寻找数组中的最大值和最小值
- css学习笔记
- C#与json
- java代码无法解析自定义类
- 07-linux中安装jdk
- 算法小题二(求高次方程的一个实根2x^4-4x^3+6X^2-8x-8=0)
- javascript学习笔记
- DataGridView在vb.net中的操作技巧