题目链接:https://odzkskevi.qnssl.com/6fd8c99567698f4bad5a228cc982bad7?v=1535352582
题意:给出正方形大小,和走的步数,问最后停的坐标。图形都是由前一个图形经过相同的反转规律得到的。
思路:递归求解,根据四个区域的反转规律不同,得到相应坐标。
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70#include <bits/stdc++.h> using namespace std; typedef long long ll; struct Point { int x, y; }; Point dfs(int n, int m) { Point tmp; if(n == 2) { if(m == 0) { tmp.x = 1; tmp.y = 1; } else if(m == 1) { tmp.x = 1; tmp.y = 2; } else if(m == 2) { tmp.x = 2; tmp.y = 2; } else if(m == 3) { tmp.x = 2; tmp.y = 1; } return tmp; } int tn = m / (n *n / 4); int mod = m % (n *n / 4);//只需求多余的部分即可 tmp = dfs(n/2, mod); if(tn == 0) { swap(tmp.x, tmp.y);//左下角区域,交换x,y即可 return tmp; } else if(tn == 1) { tmp.y += n / 2;//左上角区域,类似n/2的图形,只是y坐标要加n/2(上移) return tmp; } else if(tn == 2) { tmp.y += n / 2;//右上角,同样类似n/2的图形,xy都要上移 tmp.x += n / 2; return tmp; } else if(tn == 3) { int x = n+1-tmp.y;//第四个区域的反转是难点,可以先反转为第一个区域,再对称的看 int y = n/2+1 - tmp.x; return (Point){x, y}; } } int main() { ll n, m; while(cin >> n >> m) { Point ans = dfs(n, --m); cout << ans.x << " " << ans.y << endl; } }
最后
以上就是大力小丸子最近收集整理的关于Gym - 101667F— Philosopher’s Walk (递归)的全部内容,更多相关Gym内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复