BJFU小赛1334仓鼠球解题报告

仓鼠球

时间限制(普通/Java):1000MS/3000MS          运行内存限制:65536KByte
总提交:214            测试通过:44

描述

一日,仓鼠君在一个由10×10的格子构成的竞技场里滚球,每一块格子高度不同;
仓鼠君有特别的滚球技巧,可以每次精准地向前后左右四个方向中的一个滚动一格;
仓鼠君只能从高的格子向相邻的相同高度或更低的格子滚动;
如果两个格子高度差超过100(不含100),那么仓鼠君不能向这个格子移动,否则会摔碎自己的球;
仓鼠君不会抛弃他的球。

现在,给你每个格子的高度,问仓鼠君能够到达的所有格子的数目(包括开始时的格子)(在任何一个路线中经过的格子都算在结果中)。

输入

输入第一行是一个整数T(1<=T<=20),代表测试数据的数量;
然后第一行是两个整数x和y,代表仓鼠君开始时的坐标(0<=x,y<=9);
然后是一个10×10的矩阵,表示每个格子的高度(0<=h<=200)。

输出

对于每组数据在一行内输出一个整数,表示仓鼠君能够到达的所有格子数目(包括开始时的格子)(在任何一个路线中经过的格子都算在结果中)。

样例输入

1
0 0
200 199 198 197 196 195 194 193 192 191
199 198 197 196 195 194 193 192 191 190
198 197 196 195 194 193 192 191 190 189
197 196 195 194 193 192 191 190 189 188
196 195 194 193 192 191 190 189 188 187
195 194 193 192 191 190 189 188 187 186
194 193 192 191 190 189 188 187 186 185
193 192 191 190 189 188 187 186 185 184
192 191 190 189 188 187 186 185 184 183
191 190 189 188 187 186 185 184 183 182

样例输出

100

提示

仓鼠君能够在不同路线中走到所有的格子,故结果为100。

分析:

可以用递归模拟仓鼠君的路线,每走一步都有相同的选择,走过的位置就不再重复。

代码:

#include<stdio.h>
#include<string.h>
#define N 10
int a[N][N];
int vis[N][N];
int func(int x, int y, int f) {
    int sum = 0;
    if (x >= 10 || x < 0 || y >= 10 || y < 0 || vis[x][y])
        return sum;
    if (!f) {  //star position
        sum++;
        vis[x][y] = 1;
    } else if (f == 1) {
        if (a[x - 1][y] >= a[x][y]) {
            if (a[x - 1][y] - a[x][y] <= 100) {
                vis[x][y] = 1;
                sum++;
            } else
                return 0;
        } else
            return 0;
    } else if (f == 2) {
        if (a[x + 1][y] >= a[x][y]) {
            if (a[x + 1][y] - a[x][y] <= 100) {
                vis[x][y] = 1;
                sum++;
            } else
                return 0;
        } else
            return 0;
    } else if (f == 3) {
        if (a[x][y - 1] >= a[x][y]) {
            if (a[x][y - 1] - a[x][y] <= 100) {
                vis[x][y] = 1;
                sum++;
            } else
                return 0;
        } else
            return 0;
    } else if (f == 4) {
        if (a[x][y + 1] >= a[x][y]) {
            if (a[x][y + 1] - a[x][y] <= 100) {
                vis[x][y] = 1;
                sum++;
            } else
                return 0;
        } else
            return 0;
    }
    sum += func(x + 1, y, 1); //right  f=1
    sum += func(x - 1, y, 2); //left   f=2
    sum += func(x, y + 1, 3); //up     f=3
    sum += func(x, y - 1, 4); //down     f=4
    return sum;
}
int main() {
    int t, x, y;
//    freopen("Data.txt", "r", stdin);
//    freopen("Out.txt", "w", stdout);
    scanf("%d", &t);
    while (t--) {
        scanf("%d%d", &x, &y);
        memset(vis, 0, sizeof(vis));
        for (int i = 0; i < 10; i++) {
            for (int j = 0; j < 10; j++) {
                scanf("%d", &a[i][j]);
            }
        }
        printf("%d\n", func(x, y, 0));
    }
    return 0;
}

这是我第一次独立写递归。。中途遇见了很多问题,比如说条件不能全写在一个括号里,会造成死循环。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值