2025年【江苏"信息与未来"编程思维】真题及题解(T2:坐标变换)
题目描述
今天我们玩的许多游戏都是真正的 3 D 3\text D 3D 游戏。在计算机能效处理三维对象之前,人们就发明了斜 45 45 45 度视角的 " 2.5 D 2.5\text D 2.5D" 游戏,不需要额外的 3 D 3\text D 3D 加速硬件也能流畅运行。
2.5 D 2.5\text D 2.5D 游戏的地图是一个 n n n 行、 m m m 列的网格。我们首先将网格里的格子按照从上到下、从左到右的顺序从 1 1 1 开始编号,再把网格顺时针 (向右) 旋转 45 45 45 度,就得到了游戏的地图。此时,网格的行和列发生了变化:旋转后最顶部的格子位于第一行;最左侧的格子位于第一列,如下图所示:

Dr. X 希望实现自己的 2.5 D 2.5\text D 2.5D 游戏引擎,他希望你计算 n n n 行 m m m 列网格中,编号为 k k k 的格子,在旋转 45 45 45 度后的新网格中的行和列。
输入格式
输入空格分隔的整数 n , m n, m n,m 和 k k k,分别表示网格的行数、列数和格子的编号。
输出格式
输出空格分隔的整数 x , y x, y x,y,表示编号为 k k k 的格子在旋转 45 45 45 度后的新网格中的坐标。
输入输出样例 1
输入 1
4 3 7
输出 1
3 2
输入输出样例 2
输入 2
16 16 233
输出 2
23 10
说明/提示
对于 60 % 60\% 60% 的数据, n , m ≤ 100 n, m \le 100 n,m≤100。
对于 100 % 100\% 100% 的数据, 1 ≤ n , m ≤ 32768 , 1 ≤ k ≤ n × m 1 \le n, m \le 32768, 1 \le k \le n \times m 1≤n,m≤32768,1≤k≤n×m。
思路分析
题目给出一个 n 行 m 列的网格,格子按行优先从 1 开始编号。已知编号 k,先还原它在原网格中的行 i 和列 j:
- 行: i = ( k − 1 ) / m + 1 i = (k-1) / m + 1 i=(k−1)/m+1(整除)
- 列: j = ( k − 1 ) % m + 1 j = (k-1) \% m + 1 j=(k−1)%m+1(取余)
将原网格顺时针旋转 45 ∘ 45^\circ 45∘ 后,新坐标满足:
- 新行:(x = i + j - 1)(最顶部的格子行号最小)
- 新列:(y = n + j - i)(最左侧的格子列号最小)
代码实现
cpp
#include <bits/stdc++.h>
using namespace std;
int main() {
int n, m, k;
cin >> n >> m >> k;
int i = (k - 1) / m + 1; //原行
int j = (k - 1) % m + 1; //原列
int x = i + j - 1; //旋转后行
int y = n + j - i; //旋转后列
cout << x << " " << y ;
return 0;
}
功能分析
- 输入三个整数 (n,m,k),分别表示网格行数、列数和目标格子的编号。
- 通过整数除法和取模运算,将一维编号还原为二维原坐标。
- 利用旋转 45 ∘ 45^\circ 45∘ 的坐标变换公式,直接计算出新网格中的行号和列号。
- 输出两个整数,即旋转后的坐标。
【秘籍汇总】(完整csp信奥赛C++学习资料):
1、csp/信奥赛C++,完整信奥赛系列课程(永久学习):
https://edu.csdn.net/lecturer/7901 点击跳转

2、CSP信奥赛C++竞赛拿奖视频课:
https://edu.csdn.net/course/detail/40437 点击跳转

https://edu.csdn.net/course/detail/41081 点击跳转

3、csp信奥赛高频考点知识详解及案例实践:
CSP信奥赛C++动态规划:
https://blog.csdn.net/weixin_66461496/category_13096895.html点击跳转
CSP信奥赛C++标准模板库STL:
https://blog.csdn.net/weixin_66461496/category_13108077.html 点击跳转
信奥赛C++提高组csp-s知识详解及案例实践:
https://blog.csdn.net/weixin_66461496/category_13113932.html 点击跳转
4、csp信奥赛冲刺一等奖有效刷题题解:
信奥赛C++普及组CSP-J一等奖通关刷题题单及题解:
https://blog.csdn.net/weixin_66461496/category_12673810.html 点击跳转
信奥赛C++普及组csp-j初赛&复赛真题题解(持续更新): https://blog.csdn.net/weixin_66461496/category_12808781.html 点击跳转
信奥赛C++提高组csp-s初赛&复赛真题题解(持续更新):
https://blog.csdn.net/weixin_66461496/category_13125089.html 点击跳转
5、GESP C++考级真题题解:

GESP(C++ 一级+二级+三级)真题题解(持续更新):https://blog.csdn.net/weixin_66461496/category_12858102.html 点击跳转

GESP(C++ 四级+五级+六级)真题题解(持续更新):https://blog.csdn.net/weixin_66461496/category_12869848.html 点击跳转

GESP(C++ 七级+八级)真题题解(持续更新):
https://blog.csdn.net/weixin_66461496/category_13117178.html 点击跳转
· 文末祝福 ·
cpp
#include<bits/stdc++.h>
using namespace std;
int main(){
cout<<"跟着王老师一起学习信奥赛C++";
cout<<" 成就更好的自己! ";
cout<<" csp信奥赛一等奖属于你! ";
return 0;
}
