A - 6789(全面思考)

题目
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
题意:已知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;
}
发布了90 篇原创文章 · 获赞 18 · 访问量 3366

猜你喜欢

转载自blog.csdn.net/sherry_zhen/article/details/102999261