专栏文章
题解: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 题解
题目思路
这道题比较简单,可以手推出所有情况,其中只有如下几种情况可能满足条件:
-
一组旋转后的对应位置为 或 ,且这组对应位置不是同一个位置,两个位置的数字相同时需要一次旋转操作;
-
一组旋转后的对应位置为 ,且这组对应位置不是同一个位置,需要一次旋转操作;
-
一组旋转后的对应位置为 ,不需要旋转操作。
显然可以暴力判断所有情况,但这样太麻烦了,代码见下方。
我一开始是这么写的,但太长了。随后我发现可以把所有情况打进一个二维数组,如果一组对应位置相同就额外再打进一个一维数组,判断的时候就可以简洁很多。
为了更好地理解这种做法,这里给出最终计算好的数组,用表格形式给出,其中将数字 作为 下标节省空间。
一维数组:
| 下标 | ||||
|---|---|---|---|---|
| 值 |
二维数组(显然横纵下标顺序不重要,所以这里不给出明确顺序):
这样写可以更简洁,同样代码见下方。
题目代码
可以在代码中暴力判断,但是这样可能会比较长,就像这样。
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 条评论,欢迎与作者交流。
正在加载评论...