HDOJ-2258 Continuous Same Game (1) dfs
来源:互联网 发布:淘宝信誉在哪里看 编辑:程序博客网 时间:2024/06/11 21:08
题目链接:here
题意:
坑人啊!!我被英文给坑人。。写了两天!!才看出是题意理解错了!!弄明白之后果断AC。。。
题意是这样的,就是这种游戏。。大家都玩过。一个n*m的方格,1-5代表5种颜色的小格子。碰到2个,或者2个以上在一起的小格子就自动消掉。。这个人比较笨,只会一个一个的消掉,先消掉数量最大的,当数量相同的时候,取i小的那个,i 相同就取 j 小的那个,当下面的没有了,就下移。。一整竖排没有的时候,左边的右移(我一开始以为左移!!)。。。然后每次消掉 n 个连续的,得分就是 n*(n+1)。。。算最后的了多少分。
分析:
先 dfs 那些一样格子的数量,然后消掉。。最后判断需不需要下移或者右移。。然后搞定。
代码:
#include <iostream>#include <cstdio>#include <cstring>using namespace std;const int maxn = 22;int dir[4][2] = {{1,0},{-1,0},{0,1},{0,-1}};int n, m;char map[maxn][maxn];int vis[maxn][maxn];//标记每次是否访问,并且访问的是第几个块int maxnum[maxn*maxn];//记录每个标记的块数int len;int s;//左边第几排开始void dfs(int x, int y, char ch, int num){int nx, ny;for (int i=0; i<4; i++){nx = x + dir[i][0];ny = y + dir[i][1];if (map[nx][ny] == '0' || map[nx][ny] != ch || vis[nx][ny]) continue;vis[nx][ny] = num;maxnum[num] ++;dfs(nx, ny, ch, num);}}int main(){while (scanf("%d %d", &n, &m) != EOF){memset(map, '0', sizeof(map));getchar();s = 1;int i, j;for (i=1; i<=n; i++){for (j=1; j<=m; j++){char c = getchar();map[i][j] = c;}getchar();}int ans = 0;while (true){memset(vis, 0, sizeof(vis));memset(maxnum, 0, sizeof(maxnum));len = 1;for (i=1; i<=n; i++)for (j=s; j<=m; j++)if (vis[i][j] == 0 && map[i][j] != '0'){vis[i][j] = len;maxnum[len] ++;dfs(i, j, map[i][j], len);len ++;}int Max = 0, iMax = 0;for (i=1; i<len; i++)if (maxnum[i] > Max)Max = maxnum[i], iMax = i;if (Max <= 1) break;ans += Max * Max - Max;for (i=1; i<=n; i++)for (j=s; j<=m; j++)if (vis[i][j] == iMax)for (int k=i; map[k][j] != '0'; k--)map[k][j] = map[k-1][j];bool flag = true;while (flag){int mark = 0;for (int j=m; j>=s; j--){flag = true;for (int i=1; i<=n; i++)if (map[i][j] != '0')flag = false;if (flag){mark = j;break;}}if (flag){for (i=1; i<=n; i++)for (int k=mark; k >= s; k--)map[i][k] = map[i][k-1];s++;}if (m < 1 || s >= m) flag = false;}}printf("%d\n", ans);}return 0;}
样例输入:
8 811223344551122334455112233445511223344551122334455112233445511229 91112223334445551112223334445551112223334445551112223334445551112223334445551112225 512345543211112222333123456 61122332223334444412211115552222222118 81234543212345321321452311354231123541351131354213135421231354132
样例输出:
6416244122120
- HDOJ-2258 Continuous Same Game (1) dfs
- hdoj 2258 Continuous Same Game (1) (DFS+模拟)
- HDU-2258-Continuous Same Game (1)(DFS+模拟)
- HDU 2258 Continuous Same Game (1) (dfs+模拟)
- hdu2258 Continuous Same Game (1)
- ZOJ 3048 (HDU 2258) Continuous Same Game (1)
- HDU-2259-Continuous Same Game (2)(BFS+DFS+模拟)
- ZJU_3048 Continuous Same Game
- hdu2258Continuous Same Game (1) (消消乐)
- HDOJ 题目1760 A New Tetris Game(DFS,博弈)
- GAME Idea(continuous updating)
- POJ1027--The Same Game
- 【模拟】POJ_1027_The Same Game
- poj1027 The Same Game
- The Same Game
- The Same Game POJ
- DFS:100. Same Tree
- poj 1027 The Same Game
- shell 中定义数组
- nand flash学习笔记一
- 最大值最小问题
- 人脸识别图像库
- JS 对象机制深剖——Object.prototype 是谁?
- HDOJ-2258 Continuous Same Game (1) dfs
- UVa-1428 - Ping pong
- 知名大学硕博论文及英文期刊全文资源集合
- 如何将rdba转换成数据文件的地址
- Populating Next Right Pointers in Each Node
- 一个简单的GLSL Shader例子
- 一些有用的sql语句
- nginx负载均衡和lvs负载均衡的比较分析
- 面向对象编程:继承