F - Philosopher's Walk Gym - 101667F
Posted tcctw
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了F - Philosopher's Walk Gym - 101667F相关的知识,希望对你有一定的参考价值。
题意:如图所示,方格按图中的顺序进行标号,给定区域的边长和一个值,问此值所在的格子坐标
思路:将区域划分成四份,逐渐将所求的范围减小,进行递归求解,直到边长为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的主要内容,如果未能解决你的问题,请参考以下文章
Dining-Philosopher's Monitor 解决方案:`pickup(i)` 是不是需要间接调用`self[i].signal()`?