题目
题意:已知n行m列,输入的数字只有“6” “7” “8” “9”,问需是否能使矩阵变成中心对称;如果能,请输出最小的翻转次数;否则输出-1;
AC代码
#include <bits/stdc++.h>
using namespace std;
int a[510][510];
int main()
{
int n,m,i,j;
cin>>n>>m;
for(i=1; i<=n; i++)
{
for(j=1; j<=m; j++)
{
char ch;//题目数据没有空格,用字符处理;
cin >> ch;
a[i][j]=ch-'0';
}
}
int sum=0;
if(n==1&&m==1)//特判情况
{
if(a[n][m]==8)//8本身就是中心对称
cout<<"0" << endl;
else
cout<<"-1"<<endl;//其余都不是中心对称
}
else
{
int flag=1,f=1;
for(i=1; i<=n; i++)
{
for(j=1; j<=m; j++)
{
if(a[i][j]==6&&a[i][j]==a[n+1-i][m+1-j])
sum++;
else if(a[i][j]==9&&a[i][j]==a[n+1-i][m+1-j])
sum++;
else if(a[i][j]==7&&a[i][j]==a[n+1-i][m+1-j])
sum++;
else if(a[i][j]==8&&a[i][j]==a[n+1-i][m+1-j])
sum=sum+0;
else if(a[i][j]==6&&a[n+1-i][m+1-j]==9)
sum=sum+0;
else if(a[i][j]==9&&a[n+1-i][m+1-j]==6)
sum=sum+0;
else
{
flag=0;
break;
}
}
if(flag==0)
{
f=0;
break;
}
}
sum/=2;//全跑一遍,求一半
if(m%2!=0&&n%2!=0)//特殊情况奇数行奇数列
{
if(a[(n/2)+1][(m/2)+1]==8)//中间数是8属于中心对称
{
f=1;
}
else f=0;//其余都不是中心对称
}
if(f==0) cout<<"-1"<<endl;
else cout<<sum<<endl;
}
return 0;
}