东华OJ 基础题78 方块转换——难度中

文章介绍了如何使用C++编写一个程序,通过分析给定的黑白正方形图案和目标图案,找出通过最少转换步骤实现的方案,包括旋转和翻转操作。
摘要由CSDN通过智能技术生成

问题描述 :

一块N x N(1=<N<=10)正方形的黑白瓦片的图案要被转换成新的正方形图案。

写一个程序来找出将原始图案按照以下列转换方法转换成新图案的最小方式:

#1:转90度:图案按顺时针转90度。

#2:转180度:图案按顺时针转180度。

#3:转270度:图案按顺时针转270度。

#4:反射:图案在水平方向翻转(形成原图案的镜像)。

#5:组合:图案在水平方向翻转,然后按照#1-#3之一转换。

#6:不改变:原图案不改变。

#7:无效转换:无法用以上方法得到新图案。

如果有多种可用的转换方法,请选择序号最小的那个。

比如:

转换前:

 @-@
 ---
 @@-

转换后:

 @-@
 @--
 --@

这种转换采取#1(按顺时针转90度)即可。

注意:图案中的字符“@”和“-”在转90度后,还是“@”和“-”。不要认为“-”转90度后变成“|”。

输入说明 :

第一行: 单独的一个整数N。

第二行到第N+1行: N行,每行N个字符(不是’@‘就是’-');这是转换前的正方形。

第N+2行到第2*N+1行: N行,每行N个字符(不是’@‘就是’-');这是转换后的正方形。

输出说明 :

单独的一行包括1到7之间的一个数字(在上文已描述)表明需要将转换前的正方形变为转换后的正方形的转换方法。

输入范例 :

3
--@
--@
---
@@-
---
---

输出范例 :

3

完整C++代码

很枯燥,实在不想写这道

#include <bits/stdc++.h>

using namespace std;

int n;
vector<vector<char> > b(10, vector<char>(10));

// 顺时针转90
vector<vector<char> > fun90(vector<vector<char> > before) {
	vector<vector<char> > after(n, vector<char>(n));
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			after[j][n - i - 1] = before[i][j];
		}
	}
	return after;
}

// 顺时针转180 
vector<vector<char> > fun180(vector<vector<char> > before) {
	vector<vector<char> > after1 = fun90(before);
	vector<vector<char> > after2 = fun90(after1);
	return after2;
}

// 顺时针转270 
vector<vector<char> > fun270(vector<vector<char> > before) {
	vector<vector<char> > after1 = fun90(before);
	vector<vector<char> > after2 = fun90(after1);
	vector<vector<char> > after3 = fun90(after2);
	return after3;
}

// 水平翻转 
vector<vector<char> > level(vector<vector<char> > before) {
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n / 2; j++) {
			swap(before[i][j], before[i][n - j - 1]);
		}
	}
	return before;
}

int check(vector<vector<char> > c) {
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			if (c[i][j] != b[i][j]) return 0;
		}
	}
	return 1;
} 

int main()
{
	cin >> n;
	vector<vector<char> > a(n, vector<char>(n));
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			cin >> a[i][j];
		}
	}
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			cin >> b[i][j];
		}
	}
	vector<vector<char> > level_ = level(a);
	if (check(fun90(a))) {
		cout << 1 << endl;
	} else if (check(fun180(a))) {
		cout << 2 << endl;
	} else if (check(fun270(a))) {
		cout << 3 << endl;
	} else if (check(level_)) {
		cout << 4 << endl;
	} else {
		if (check(fun90(level_)) || check(fun180(level_)) || check(fun270(level_))) {
			cout << 5 << endl;
		} else if (check(a)) {
			cout << 6 << endl;
		} else {
			cout << 7 << endl;
		}
	}
	return 0;
}

😋欢迎大伙私信或者评论区交流讨论😋

  • 11
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值