专栏文章

题解:P14612 [2019 KAIST RUN Fall] 6789

P14612题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@mimzh4gs
此快照首次捕获于
2025/12/01 18:05
3 个月前
此快照最后确认于
2025/12/01 18:05
3 个月前
查看原文

P14612 题解

题目思路

这道题比较简单,可以手推出所有情况,其中只有如下几种情况可能满足条件:
  • 一组旋转后的对应位置为 669 9,且这组对应位置不是同一个位置,两个位置的数字相同时需要一次旋转操作;
  • 一组旋转后的对应位置为 7 7,且这组对应位置不是同一个位置,需要一次旋转操作;
  • 一组旋转后的对应位置为 8 8,不需要旋转操作。
显然可以暴力判断所有情况,但这样太麻烦了,代码见下方。
我一开始是这么写的,但太长了。随后我发现可以把所有情况打进一个二维数组,如果一组对应位置相同就额外再打进一个一维数组,判断的时候就可以简洁很多。
为了更好地理解这种做法,这里给出最终计算好的数组,用表格形式给出,其中将数字 66 作为 00 下标节省空间。
一维数组:
下标00112233
1-11-1001-1
二维数组(显然横纵下标顺序不重要,所以这里不给出明确顺序):
00112233
00111-11-100
111-1111-11-1
221-11-1001-1
33001-11-111
这样写可以更简洁,同样代码见下方。

题目代码

可以在代码中暴力判断,但是这样可能会比较长,就像这样。CPP
#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;
}
也可以使用数组简化判断,这样代码可以更短,就像这样。CPP
#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;
}

评论

0 条评论,欢迎与作者交流。

正在加载评论...