Bailian4006 小兔子捡金币模拟

Posted 海岛Blog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Bailian4006 小兔子捡金币模拟相关的知识,希望对你有一定的参考价值。

4006:小兔子捡金币

总时间限制: 1000ms 内存限制: 65536kB
描述
在一个游戏中,小兔子可以捡金币。它会一边走一边捡掉经过的金币。当小兔子发现前方没有金币的时候,会自动右转。直到所有金币都被捡走。现在把一个NХN的方型区域内,每一格都摆方好了金币。假设小兔子从左上方第一格开始,往右边走。图示如下:

1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7

捡到的第k个金币会被标记成k,记为该金币的序号。则问第i行,第j列的金币是的序号是什么? (1≤i≤N, 1≤j≤N)
输入
第一行有一个整数K和N, N表示方型区域的大小(1≤N≤10000),而K表示输入坐标的组数。(1≤K≤25)
接下来会有K行,每一行有两上个用空格分隔的整数i和j,表示待求金币的行数和列数。
输出
一共输出K行。每一行输出一个对应坐标下金币的序号。
样例输入
3 4
1 3
2 2
3 3
样例输出
3
13
15

问题链接Bailian4006 小兔子捡金币
问题简述:(略)
问题分析:模拟题,不解释。
程序说明:(略)
参考链接:(略)
题记:(略)

AC的C++语言程序如下:

/* Bailian4006 小兔子捡金币 */

#include <stdio.h>

#define N 10000
int c[N + 1];
int dx[4] = 0, 1, 0, -1;
int dy[4] = 1, 0, -1, 0;

int main()

    int k, n;
    scanf("%d%d", &k, &n);

    c[1] = 1;
    for (int i = 1, j = 1; i <= n / 2; i++, j += 2)
        c[i + 1] = c[i] + 4 * (n - j);

    for (int i = 1; i <= k; i++) 
        int row, col, row2, col2;
        scanf("%d%d", &row, &col);
        row2 = row, col2 = col;
        if (row2 > n / 2) row2 = n - row2 + 1;
        if (col2 > n / 2) col2 = n - col2 + 1;
        int t = row2 < col2 ? row2 : col2;
        int x = t, y = t, start = c[t], x2 = 0;
        while (start < c[t + 1]) 
            if (x == row && y == col) break;
            int nextx = x + dx[x2];
            int nexty = y + dy[x2];
            if (nextx >= t && nexty >= t && nextx <= n - t + 1 && nexty <= n - t + 1)
                x = nextx, y = nexty, start++;
            else
                if (++x2 >= 4) x2 = 0;
        

        printf("%d\\n", start);
    

    return 0;

以上是关于Bailian4006 小兔子捡金币模拟的主要内容,如果未能解决你的问题,请参考以下文章

noip模拟赛 捡金币

纯JavaScript入门级小游戏:兔子抢金币(附演示地址+源码)

dp-简单迷宫捡金币

种花小游戏 随机化搜索

P1834 种花小游戏

模拟练习[一]