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

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述 :

一块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;
}

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

<think>好的,我现在需要帮助用户找到东华OJ基础第35目描述、解法或示例代码。根据用户提供的引用内容,首先查看已有的引用信息。 引用[2]提到用户完成了东华大学2020考研计算机复试的上机库,并提供了QQ群和博客链接。引用[3]包含了一段C++代码,处理二维数组并统计某些条件,可能对应某个目。引用[4]是关于斐波那契数列的目,可能不是第35。引用[1]和引用[2]中的描述比较模糊,但引用[3]的代码可能对应某个具体目。 用户需要的是第35,可能属于基础中的数组或矩阵处理问。查看引用[3]的代码,该代码输入一个n×n的矩阵,统计每列1的数量,输出超过n/2的列号。这可能对应目要求找出每列中1的个数超过半数的列。 因此,推测第35可能是统计矩阵中每列1的数量是否超过半数,并输出符合条件的列索引。解法思路是遍历矩阵,逐列统计1的数量,比较后输出结果。示例代码如引用[3]所示,使用二维数组存储矩阵,一维数组统计每列的1的个数,最后遍历统计结果输出。 需要确认用户提供的引用[3]是否对应第35。根据代码功能,可能是正确的。因此,整理目描述、分析思路和示例代码,并生成相关问。</think>### 东华OJ基础35解析 根据代码片段及描述推断,**基础35**可能为矩阵列统计问,要求找出二维数组中每列元素1的个数超过行数一半的列号[^3]。 #### 目描述(推测) 输入一个$n \times n$的01矩阵,统计每一列中1的个数。若某列1的数量超过$n/2$,则输出该列的编号(列编号从1开始)。 #### 输入说明 - 第一行为整数$n$ - 接下来$n$行,每行$n$个整数(0或1) #### 输出说明 输出满足条件的列编号,多个结果用空格分隔。 --- ### 分析思路 1. **统计每列1的个数**:遍历矩阵的每一列,统计该列中1的总数。 2. **判断条件**:若某列1的数量严格大于$n/2$(向下取整),则满足条件。例如,$n=5$时,需要1的数量$>2$。 --- ### 示例代码(C++) ```cpp #include <iostream> using namespace std; int main() { int n; cin >> n; int a[25][25], num[25] = {0}; // 列统计数组初始化 for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { cin >> a[i][j]; if (a[i][j] == 1) num[j]++; // 统计每列1的数量 } } for (int j = 1; j <= n; j++) { if (num[j] > n / 2) { // 判断是否超过半数 cout << j << " "; } } return 0; } ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值