Codeforces Round 903 (Div. 3).C Perfect Square

Codeforces Round 903 (Div. 3).C Perfect Square

题目位置:

链接: Codeforces Round 903 (Div. 3).C Perfect Square)


问大致题描述:

给出一个n*n的字母矩阵M,n一定是偶数,变换规则为每次只能使一个字母加一,用最少步数使这个矩阵可以90°旋转后不变。

输入:

5
4
abba
bcbb
bccb
abba
2
ab
ba
6
codefo
rcesco
deforc
escode
forces
codefo
4
baaa
abba
baba
baab
4
bbaa
abba
aaba
abba


输出:

1
2
181
5
9


原因分析与代码:

本题是一道典型的贪心算法,通过之前的训练我们一定要先分析问题本质,寻找影响问题的根本因素,我们发现,影响问题的根本因素在于,四个对称位置的值相等。那么如何使步数最少呢,首先本题禁止循环,这样使大家一起靠近最大值这样是最少的,紧接着如何遍历,这就是题目的偶数所在,我们只需遍历四分之一的元素就可以找到全部元素。

#include<bits/stdc++.h>
using namespace std;
const int N=1e3+100;
int n,t;
char a[N][N];
void solve()
{
	cin>>n;int num=0; 
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			cin>>a[i][j];
	for(int i=1;i<=n/2;i++)
	{
		for(int j=1;j<=n/2;j++)
		{
			if(a[i][j]==a[j][n-i+1]&&a[i][j]==a[n-i+1][n-j+1]&&a[i][j]==a[n-j+1][i]) continue;
			else
			{
				char cmax=max(a[i][j],a[j][n-i+1]);
				cmax=max(cmax,a[n-i+1][n-j+1]); cmax=max(cmax,a[n-j+1][i]);
				num=num+(cmax-a[i][j])+(cmax-a[j][n-i+1])+(cmax-a[n-i+1][n-j+1])+(cmax-a[n-j+1][i]);
			}
		}	
	}
	cout<<num<<endl;		
}
int main()
{
	cin>>t;
	while(t--) solve();
	return 0;
}

总结:

本题是一道典型的贪心算法,我们要学会透过事物的本质去分析元素,然后分析元素的关系和逻辑去刻画题型,这是我最近的一个新发现,本体就是先分析根本因素‘,再找其数学关系和逻辑关系即可解出,感觉codeforce1200的题对算法锻炼太少了,可以做出来了,明天开始1300启动!!!,加油加油!!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值