码迷,mamicode.com
首页 > 其他好文 > 详细

F - Philosopher's Walk Gym - 101667F

时间:2018-08-31 21:56:42      阅读:324      评论:0      收藏:0      [点我收藏+]

标签:技术   info   main   pen   span   phi   翻转   技术分享   坐标   

技术分享图片

题意:如图所示,方格按图中的顺序进行标号,给定区域的边长和一个值,问此值所在的格子坐标

思路:将区域划分成四份,逐渐将所求的范围减小,进行递归求解,直到边长为2时, 直接返回坐标。返回坐标后,根据图形的翻转方向,重新计算坐标

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 
 4 typedef long long ll;
 5 
 6 struct Point {
 7     int x, y;
 8 };
 9 
10 Point dfs(int n, int m) {
11     Point tmp;
12     if(n == 2) {
13         if(m == 0) { tmp.x = 1; tmp.y = 1; }
14         else if(m == 1) { tmp.x = 1; tmp.y = 2; }
15         else if(m == 2) { tmp.x = 2; tmp.y = 2; }
16         else if(m == 3) { tmp.x = 2; tmp.y = 1; }
17         return tmp;
18     }
19     int tn = m / (n *n / 4);
20     int mod = m % (n *n / 4);
21     tmp = dfs(n/2, mod);
22     if(tn == 0) {
23         swap(tmp.x, tmp.y);
24         return tmp;
25     }
26     else if(tn == 1) {
27         tmp.y += n / 2;
28         return tmp;
29     }
30     else if(tn == 2) {
31         tmp.y += n / 2;
32         tmp.x += n / 2;
33         return tmp;
34     }
35     else if(tn == 3) {
36         int x = n+1-tmp.y;
37         int y = n/2+1 - tmp.x;
38         return (Point){x, y};
39     }
40 }
41 
42 int main() {
43     //freopen("in.txt", "r", stdin);
44     ll n, m;
45     while(cin >> n >> m) {
46         Point ans = dfs(n, --m);
47         cout << ans.x << " " << ans.y << endl;
48     }
49 }

 

F - Philosopher's Walk Gym - 101667F

标签:技术   info   main   pen   span   phi   翻转   技术分享   坐标   

原文地址:https://www.cnblogs.com/tcctw/p/9568360.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!