题解:P14612 [2019 KAIST RUN Fall] 6789

· · 题解

P14612 题解

题目思路

这道题比较简单,可以手推出所有情况,其中只有如下几种情况可能满足条件:

显然可以暴力判断所有情况,但这样太麻烦了,代码见下方。

我一开始是这么写的,但太长了。随后我发现可以把所有情况打进一个二维数组,如果一组对应位置相同就额外再打进一个一维数组,判断的时候就可以简洁很多。

为了更好地理解这种做法,这里给出最终计算好的数组,用表格形式给出,其中将数字 6 作为 0 下标节省空间。

一维数组:

下标 0 1 2 3
-1 -1 0 -1

二维数组(显然横纵下标顺序不重要,所以这里不给出明确顺序):

0 1 2 3
0 1 -1 -1 0
1 -1 1 -1 -1
2 -1 -1 0 -1
3 0 -1 -1 1

这样写可以更简洁,同样代码见下方。

题目代码

::::success[可以在代码中暴力判断,但是这样可能会比较长,就像这样。]

#include<iostream>
using namespace std;
int a[505][505];
int n , m;
signed main()
{
    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++)
        {
            int pi = n - i + 1 , pj = m - j + 1;
            int x = a[i][j] , y = a[pi][pj];
            if(pi == i && pj == j && x == 7) { cout << -1 << endl; return 0; }
            if(pi == i && pj == j && y == 7) { cout << -1 << endl; return 0; }
            if(pi == i && pj == j && x == 6) { cout << -1 << endl; return 0; }
            if(pi == i && pj == j && x == 9) { cout << -1 << endl; return 0; }
            if(pi == i && pj == j && y == 6) { cout << -1 << endl; return 0; }
            if(pi == i && pj == j && y == 9) { cout << -1 << endl; return 0; }
            if(x == 8 && y != 8) { cout << -1 << endl; return 0; }
            if(x != 8 && y == 8) { cout << -1 << endl; return 0; }
            if(x == 7 && y != 7) { cout << -1 << endl; return 0; }
            if(x != 7 && y == 7) { cout << -1 << endl; return 0; }
            if(x == 6 && (y != 6 && y != 9)) { cout << -1 << endl; return 0; }
            if(y == 6 && (x != 6 && x != 9)) { cout << -1 << endl; return 0; }
            if(x == 7 && y == 7) { ans++; }
            if(x == 6 && y == 6) { ans++; }
            if(x == 9 && y == 9) { ans++; }
        }
    }
    cout << ans / 2 << endl;
    return 0;
}

::::

::::success[也可以使用数组简化判断,这样代码可以更短,就像这样。]

#include<iostream>
using namespace std;
int a[505][505];
int n , m;
int gsame[4] = {-1 , -1 , 0 , -1};
int gdif[4][4] = {
    {1 , -1 , -1 , 0} , 
    {-1 , 1 , -1 , -1} ,
    {-1 , -1 , 0 , -1} ,
    {0 , -1 , -1 , 1}
};
signed main()
{
    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 - '6';
        }
    }
    int ans = 0;
    for(int i = 1 ; i <= n ; i++)
    {
        for(int j = 1 ; j <= m ; j++)
        {
            int pi = n - i + 1 , pj = m - j + 1;
            int x = a[i][j] , y = a[pi][pj];
            if(i == pi && j == pj)
            {
                if(gsame[x] == -1)
                {
                    cout << -1 << endl;
                    return 0;
                }
                else
                {
                    ans += gsame[x];
                }
            }
            else
            {
                if(gdif[x][y] == -1)
                {
                    cout << -1 << endl;
                    return 0;
                }
                else
                {
                    ans += gdif[x][y];
                }
            }
        }
    }
    cout << ans / 2 << endl;
    return 0;
}

::::