题目描述
无
样例
3
1 1 2
2 16 1
3 4 33
算法1
很明显能看出来前一个图和 下一个图的关系
下一个图是这个图分为四部分拼起来的 左上和左下进行了以对角线为中心的翻转 而右上和右下就是上一个图
参考文献
要求点的坐标 就可以先求上一个图中的坐标 在加上一个特定的值(例如 x轴 加值 或者 y轴加值 或者都加)
只需要知道这个点在当前图的那个位置就好 (左上、左下、右上右下)
对于右上右下 的点 非常好求 因为只需要减去整数倍的上一个图就行 (具体原因自己思考)
但是对于左上左下怎么办呢? 因为有翻转 这个时候可以考虑用dfs中的晦朔来解决
完事了
参考文献
C++ 代码
pair<ll, ll> dfs(ll n, ll num) {// n表示 当前是第几级 num就是第几个房子
// cout << "n : " << n << " num : " << num << endl;
if(n == 1) {
switch(num) {
case 1: return pair <ll, ll> (1, 1);
case 2: return pair <ll, ll> (2, 1);
case 3: return pair <ll, ll> (2, 2);
case 4: return pair <ll, ll> (1, 2);
}
}
ll ans = quick(2, 2 * (n - 1));//ans表示上一个图中点的数量 一边确定当前值的位置
ll bian_x = quick(2, n - 1);// bian_x 表示上一个图的变长 用来所谓的加特定值
// cout << ans << " - " << bian_x <<endl;
// system("pause");
int cnt = 0;
pair <ll, ll> xx;
switch ((num - 1)/ ans) {
case 0: { // 如果 在 左上角 就得到上一个图的坐标后(晦朔) 以坐上到右下为轴翻转一下
xx = dfs(n - 1, num);
pair <ll, ll> yy;
yy.first = xx.second, yy.second = xx.first;
return yy;
break;
}
case 1: {
xx = dfs(n - 1, num - ans);
xx.first += bian_x;
return xx;
break;
}
case 2: {
xx = dfs(n - 1, num - 2 * ans);
xx.first += bian_x;
xx.second += bian_x;
return xx;
break;
}
case 3: {// 如果在 左下角 与在左上角同理
xx = dfs(n - 1, num - 3 * ans);
pair <ll, ll> yy;
yy.first = bian_x - xx.second + 1, yy.second = bian_x - xx.first + 1;
yy.second += bian_x;
return yy;
break;
}
}
}