51Nod-1293-球与切换器

来源:互联网 发布:珠江啤酒 阿里云 编辑:程序博客网 时间:2024/05/22 03:52

ACM模版

描述

描述

题解

看到这个问题,直接就有了思路,但是我的解法Memory limit exceeded了……

由于我是用的 bfs 解的,所以大概是因为入队列的结点太多了,并且缺乏好的优化,但是我实在是想不到什么更好的优化了,于是找了一下大牛的题解,发现可以通过创建一个 long long res[MAXN][MAXN][2]的三维数组来保存状态,用 res[x][y][0] 表示坐标为 (x, y) 的位置将要向下移动的个数,用 res[x][y][1] 表示坐标为 (x, y) 的位置将要向右移动的个数,最后输出 res[N][M][0] 即可。

这个问题是一个十分不错的模拟问题,不过卡时间和内存比较明显(当然,也可以说我自己太笨了)。

代码

#include <iostream>#include <algorithm>using namespace std;const int MAXN = 1005;int M, N;long long k;int state[MAXN][MAXN];long long res[MAXN][MAXN][2];int main(){    scanf("%d%d%lld", &M, &N, &k);    long long temp;    for (int i = 1; i <= N; i++)    {        for (int j = 1; j <= M; j++)        {            scanf("%d", &state[i][j]);            if (i != 1 || j != 1)            {                temp = res[i - 1][j][0] + res[i][j - 1][1];                switch (state[i][j])                {                    case 0:                        res[i][j][0] = res[i - 1][j][0];                        res[i][j][1] = res[i][j - 1][1];                        break;                    case 1:                        res[i][j][1] = (temp + 1) / 2;                        res[i][j][0] = temp / 2;                        break;                    default:                        res[i][j][0] = (temp + 1) / 2;                        res[i][j][1] = temp / 2;                        break;                }            }            else            {                switch (state[i][j])                {                    case 0:                        res[i][j][0] = k;                        res[i][j][1] = 0;                        break;                    case 1:                        res[1][1][1] = (k + 1) / 2;                        res[1][1][0] = k / 2;                        break;                    default:                        res[1][1][0] = (k + 1) / 2;                        res[1][1][1] = k / 2;                        break;                }            }        }    }    printf("%lld\n", res[N][M][0]);    return 0;  }
1 0