Bailian4006 小兔子捡金币模拟
Posted 海岛Blog
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Bailian4006 小兔子捡金币模拟相关的知识,希望对你有一定的参考价值。
总时间限制: 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 小兔子捡金币模拟的主要内容,如果未能解决你的问题,请参考以下文章