Rock, Scissors, Paper
题目连结
题目意思
大概讲一下题目再讲啥
新的表就是旧的领地去四周(上下左右)找,有赢他的型态就淘汰
,其位置在新的表改变赢他的型态==>如果都平手或赢就不用变
EX:
RSR
RRR
RPR
DAY 1:
第一个 R (第一排第一列)的四周分别为 ==> S(右)、R(下) ==> R 没输过 新表的第一排第一列变成 R
第二个 S (第二排第一列)的四周分别为 ==> R(左)、R(右)、R(下) ==> 输给 R,新表的第二排第一列变成 R
第三个 R 与第一个一样, R 没输过 新表的第三排第一列变成 R
换排第一个 R (第一排第二列)的四周分别为 ==> R(上)、R(右)、R(下) ==> R 没输过 新表的第一排第二列变成 R
第二个 R (第二排第二列)的四周分别为 ==> S(上)、R(左)、R(右)、P(下) ==> P 赢 R 新表的第二排第二列变成 P
第三个 R 与第一个一样, R 没输过 新表的第三排第二列变成 R
换排同上操作
最后新表为:
RRR
RPR
PPP
至于 DAY 2 就把DAY 1当旧表
,而 DAY 2 就是新表
解题
先建一个表(r+2)*(c+2) ,填满'X'
将输入(例如):
RRR
RRR
RRR
变为:
XXXXX
XRRRX
XRRRX
XRRRX
XXXXX
(包裹起来,这样就可以上下左右比较赢还是输)
比较规则:
任何型态(R、S、P)遇到 X ==> 变自己P 遇到 S ==> 变 SS 遇到 R ==> 变 RR 遇到 P ==> 变 P其他情况,如平手或赢(像是R遇到S) ==> 变自己code
王手~
#include <iostream>#include <vector>#include <map>using namespace std;char Whowin(char a, char b, char change){ char k; if (a == b) k = a; else if (a == 'P' && b == 'S') { k = 'S'; } else if (a == 'S' && b == 'R') { k = 'R'; } else if (a == 'R' && b == 'P') { k = 'P'; } else { k = a; } if (k == change || k == a) return change; else return k;}int main(int argc, char const *argv[]){ int t; cin >> t; while (t--) { int r, c, d; cin >> r >> c >> d; vector<vector<vector<char>>> updata(d + 1, vector<vector<char>>(r + 2, vector<char>(c + 2, 'X'))); for (int n = 0; n <= d; n++) for (int i = 0; i < r + 2; ++i) for (int j = 0; j < c + 2; ++j) updata[n][i][j] = 'X'; for (int i = 1; i <= r; i++) { for (int j = 1; j <= c; j++) { cin >> updata[0][i][j]; } } for (int n = 1; n <= d; n++) { for (int i = 1; i <= r; i++) { for (int j = 1; j <= c; j++) { // 这里要多加一个 o 避免改变又被其他值洗掉 char o = updata[n - 1][i][j]; o = Whowin(updata[n - 1][i][j], updata[n - 1][i][j + 1], o); o = Whowin(updata[n - 1][i][j], updata[n - 1][i + 1][j], o); o = Whowin(updata[n - 1][i][j], updata[n - 1][i][j - 1], o); o = Whowin(updata[n - 1][i][j], updata[n - 1][i - 1][j], o); updata[n][i][j] = o; } } } for (int i = 1; i <= r; i++) { for (int j = 1; j <= c; j++) { cout << updata[d][i][j]; } cout << endl; } cout << endl; } return 0;}