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




原创粉丝点击