春季训练赛5:思维模拟题 CF426B Sereja and Mirroring

Sereja and Mirroring

题目

Let’s assume that we are given a matrix b of size x × y, let’s determine the operation of mirroring matrix b. The mirroring of matrix b is a 2x × y matrix c which has the following properties:

the upper half of matrix c (rows with numbers from 1 to x) exactly matches b;
the lower half of matrix c (rows with numbers from x + 1 to 2x) is symmetric to the upper one; the symmetry line is the line that separates two halves (the line that goes in the middle, between rows x and x + 1).
Sereja has an n × m matrix a. He wants to find such matrix b, that it can be transformed into matrix a, if we’ll perform on it several (possibly zero) mirrorings. What minimum number of rows can such matrix contain?

Input
The first line contains two integers, n and m (1 ≤ n, m ≤ 100). Each of the next n lines contains m integers — the elements of matrix a. The i-th line contains integers ai1, ai2, …, aim (0 ≤ aij ≤ 1) — the i-th row of the matrix a.

Output
In the single line, print the answer to the problem — the minimum number of rows of matrix b.

Examples
inputCopy
4 3
0 0 1
1 1 0
1 1 0
0 0 1
outputCopy
2
inputCopy
3 3
0 0 0
0 0 0
0 0 0
outputCopy
3
inputCopy
8 1
0
1
1
0
0
1
1
0
outputCopy
2
Note
In the first test sample the answer is a 2 × 3 matrix b:

001
110
If we perform a mirroring operation with this matrix, we get the matrix a that is given in the input:

001
110
110
001

题意

给了镜像对称的概念,然后问你,他给出的矩阵,最小的镜像是多少行

思路

每次都对半分,然后遍历每一列,看是否满足这个矩阵镜像对称,如果是的话,就再次取一半,然后判断是否镜像对称。
如果遇到了行数为奇数行的,那么肯定没办法构成镜像对称(这个在题目中镜像对称的定义里面算是有解释了),那么每次折半要判断一下是否剩奇数行,如果是的话就停止了。

反思

这道题是简单的模拟题,写它是因为自己犯错了。没有考虑到偶数除以2之后可能会变成奇数,这个几乎是小学生都懂的道理,自己也懂,但是在打码就压根没考虑。

代码

#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
int a[105][105]; 
int  main()
{
	int n,m;
	scanf("%d%d",&n,&m);
	//matrix 是指矩阵
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
			scanf("%d",&a[i][j]);
			
	if(n&1)
		return 0*printf("%d\n",n);
	else//这里的n是偶数,判断是否可以镜像对称,可以则再折半判断,如果不可以则输出此时的n ,奇数行也终止。
	{
		while(1)
		{
			if(n&1)//偶数除以2有可能变成奇数呢 
				return 0*printf("%d\n",n);
				
			int flag=1;
			for(int j=1;j<=m;j++)
				for(int i=1;i<=n/2;i++)
					if(a[i][j]!=a[n-i+1][j])
						flag=0;

			if(flag==0)//当前的n无法镜像对称 
				return 0*printf("%d\n",n); 
			else//能够对称
				n/=2;
		}
	}
	return 0;
} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值