原题目链接:
P1205 [USACO1.2] 方块转换 Transformations - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
原题目截图:
思路分析:
这题目还是比较简单,模拟一下旋转变化的过程,然后注意变换的规律就行了。
-
读取输入:首先读取矩阵的大小
n
,然后分别读取两个矩阵start
和end
。 -
定义操作函数:
op1
:顺时针旋转90度。op2
:逆时针旋转90度(通过两次旋转180度实现)。op3
:逆时针旋转90度。op4
:水平方向翻转。op5
:先水平翻转,然后尝试顺时针或逆时针旋转90度。op6
:不做任何操作。
-
比较矩阵:通过调用上述操作函数,比较操作后的
start
矩阵是否与end
矩阵相等。 -
输出结果:根据操作函数的返回值,输出对应的操作编号。如果所有操作都无法将
start
矩阵转换成end
矩阵,则输出7。
解决代码:
#include<iostream>
using namespace std;
#include<vector>bool op1(vector<vector<char>>&start,vector<vector<char>>& end,int n) {//顺时针旋转90度vector<vector<char>>martix = start;for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {martix[j][n - 1 - i] = start[i][j];}}return end == martix;}bool op2(vector<vector<char>>& start,vector<vector<char>>& end, int n) {vector<vector<char>>martix = start;for (int i = n - 1; i >= 0; i--) {for (int j = n - 1; j >= 0; j--) {martix[n - 1 - i][n - 1 - j] = start[i][j];}}return end == martix;}bool op3(vector<vector<char>>& start,vector<vector<char>>& end, int n) {vector<vector<char>>martix = start;//逆时针旋转90度for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {martix[n-1-j][i] = start[i][j];}}return end == martix;}bool op4(vector<vector<char>>& start,vector<vector<char>>& end, int n) {vector<vector<char>>martix = start;//水平方向翻转for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {martix[i][n-1-j] = start[i][j];}}return end == martix;}bool op5(vector<vector<char>>& start,vector<vector<char>>& end, int n) {vector<vector<char>>martix = start;//水平方向翻转后,再执行op1,op2,op3之间的其中一种方式for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {martix[i][n - 1 - j] = start[i][j];}}return op1(martix, end, n) || op2(martix, end, n) || op3(martix, end, n);}bool op6(vector<vector<char>>& start,vector<vector<char>>& end, int n) {vector<vector<char>>martix = start;//不变return end == start;}int main() {int n;cin >> n;vector<vector<char>>start(n,vector<char>(n));vector<vector<char>>end(n, vector<char>(n));for (int i = 0; i < n; i++) {string str;cin >> str;for (int j = 0; j < str.size();j++) {start[i][j] = str[j];}}for (int i = 0; i < n; i++) {string str;cin >> str;for (int j = 0; j < str.size(); j++) {end[i][j] = str[j];}}if (op1(start, end, n)) cout << 1;else if (op2(start, end, n)) cout << 2;else if (op3(start, end, n)) cout << 3;else if (op4(start, end, n)) cout << 4;else if (op5(start, end, n)) cout << 5;else if (op6(start, end, n)) cout << 6;else cout << 7; //无法转换return 0;}