题目位置:
链接: 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启动!!!,加油加油!!