题解:P14612 [2019 KAIST RUN Fall] 6789

· · 题解

如果旋转后的位置上的数字不是当前位置上的数字,那么就需要将这个数字单独旋转一下,需要旋转的数量 +1,但是如果这个数字反转后仍然不是旋转后的位置上的数字,那么这个矩阵不可能是神奇矩阵,输出 -1

注意:如果旋转后的位置就是当前位置,那么这个位置只能是 8,因为只有 8 自身点对称,如果存在这样的位置但数字不是 8,那么应该输出 -1

还有一点,需要单独旋转的数字会被两个位置统计,所以如果统计的结果是 ans,那么应该输出 \frac{ans}{2}

代码

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define ft first
#define sd second
#define fs(i,x,y) for(int i=(x);i<=(y);i++)
#define fj(i,x,y) for(int i=(x);i>=(y);i--)
int dc[]={0,7,0,0,0,0,9,1,8,6};
int n,m,a[505][505];
signed main(){
    std::ios::sync_with_stdio(false);
    cin.tie(0); 
    cout.tie(0);
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            char c;
            cin>>c;
            a[i][j]=c-'0';
        }
    }
    int ans=0;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            if(dc[a[i][j]]!=a[n-i+1][m-j+1]){
                ans++;
                if(a[i][j]!=a[n-i+1][m-j+1]){
                    cout<<-1;
                    return 0;
                }
            }
            if(i==n-i+1&&j==m-j+1&&a[i][j]!=8){
                cout<<-1;
                return 0;
            }
        }
    }
    cout<<ans/2;
    return 0;
}