[一天至少一题直到 ICPC 开赛 #020] 解题:Rock, Scissors, Paper(12/31)

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;}

关于作者: 网站小编

码农网专注IT技术教程资源分享平台,学习资源下载网站,58码农网包含计算机技术、网站程序源码下载、编程技术论坛、互联网资源下载等产品服务,提供原创、优质、完整内容的专业码农交流分享平台。

热门文章