题解:P14612 [2019 KAIST RUN Fall] 6789

· · 题解

题目大意

通过对题目中给定的 n\times m 的矩阵中单某个数字进行翻转,有解输出翻转次数,无解则输出 -1

思路

枚举 map[i][j]map[n-i+1][m-j+1] 匹配。

情况:

  1. 两个 6 两个9 两个7 ,翻转其中一个。
  2. 两个 8 69 96 本身合法不用处理。
  3. 除去以上情况,剩余情况不合法则输出 -1

注意:对中心特判只有 8 合法。

代码

#include<bits/stdc++.h>
using namespace std;
int n, m, nl, ml, ans;
int mp[510][510];
int main()
{
    cin >> n >> m;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            char a;
            cin >> a;
            mp[i][j] = a-'0';
        }
    }
    if(n%2==1&&m%2==1)
    {
        if(mp[n/2+1][m/2+1] != 8)
        {
            cout << -1;
            return 0;
        }
    }
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            if(mp[i][j] == 6&&mp[n-i+1][m-j+1] == 9) continue;
            if(mp[i][j] == 9&&mp[n-i+1][m-j+1] == 6) continue;
            if(mp[i][j] == 7&&mp[n-i+1][m-j+1] == 10) continue;//10为倒7 
            if(mp[i][j] == 10&&mp[n-i+1][m-j+1] == 7) continue;
            if(mp[i][j] != mp[n-i+1][m-j+1])
            {
                cout << "-1";
                return 0;
            }
            if(mp[i][j] == 6&&mp[n-i+1][m-j+1] == 6)
            {
                ans++;
                mp[n-i+1][m-j+1] = 9;
                continue;
            }
            if(mp[i][j] == 9&&mp[n-i+1][m-j+1] == 9)
            {
                ans++;
                mp[n-i+1][m-j+1] = 6;
                continue;
            }
            if(mp[i][j] == 7&&mp[n-i+1][m-j+1] == 7)
            {
                ans++;
                mp[n-i+1][m-j+1] = 10;
                continue;
            }
        }
    }
    cout << ans;
    return 0;
}