1. 程式人生 > >生活大爆炸版石頭剪刀布-簡單模擬

生活大爆炸版石頭剪刀布-簡單模擬

連結傳送門:https://www.luogu.org/problemnew/show/P1328

理解題意後一般大家的思路都是這樣的:

逐個比較嘛, 反正資料也不大,就200, 如何比較? 當然是用 if 嘛, 羅列所有的情況,反正情況也不對。

寫出來的程式碼就是這樣的

#include <cstdio>
using namespace std;
const int MAXN = 200+7;

int a1[MAXN];
int a2[MAXN];
int n, n1, n2;

int main()
{

	while(scanf("%d%d%d", &n, &n1, &n2) != EOF)
	{
		int score_a = 0;
		int score_b = 0;
		for(int i=0; i<n1; i++)
			scanf("%d", &a1[i]);
		for(int i=0; i<n2; i++)
			scanf("%d", &a2[i]);
		for(int i=0; i<n; i++)
		{
			a1[i] = a1[i%n1];
			a2[i] = a2[i%n2];
		}
		for(int i=0; i<n; i++)
		{
			switch(a1[i])
			{
				case 0:
					if(a2[i] == 2 || a2[i] == 3)
						score_a ++;
					else if(a2[i] == 0)
						break;
					else
						score_b ++;
					break;
				case 1:
					if(a2[i] == 0 || a2[i] == 3)
						score_a ++;
					else if(a2[i] == 1)
						break;
					else
						score_b ++;
					break;
				case 2:
					if(a2[i] == 1 || a2[i] == 4)
						score_a ++;
					else if(a2[i] == 2)
						break;
					else
						score_b ++;
					break;
				case 3:
					if(a2[i] == 2 || a2[i] == 4)
						score_a ++;
					else if(a2[i] == 3)
						break;
					else
						score_b ++;
					break;
				case 4:
					if(a2[i] == 0 || a2[i] == 1)
						score_a ++;
					else if(a2[i] == 4)
						break;
					else
						score_b ++;
					break;
			}
		}
		printf("%d %d\n", score_a, score_b);

	}


	return 0;
}

這個思路簡單易懂,一點問題也沒有。都是if,執行起來也很快,這也是我看到這道題的第一個想法。

然後我看到討論區裡有說打表的,然後就覺得這個方法更簡潔,程式碼也簡單,然後就仔細思考一下,寫了一個新的程式碼。

#include <cstdio>
using namespace std;
const int MAXN = 200+7;

int score[5][5] = { {0, 0, 1, 1, 0}, {1, 0, 0, 1 ,0}, {0, 1, 0, 0, 1},
					{0, 0, 1, 0, 1}, {1, 1, 0, 0, 0} };
int a1[MAXN];
int a2[MAXN];
int main()
{
	int n, n1, n2;
	while(scanf("%d%d%d", &n, &n1, &n2) != EOF)
	{
		int ans1 = 0;
		int ans2 = 0;
		for(int i=0; i<n1; i++)
			scanf("%d", &a1[i]);
		for(int i=0; i<n2; i++)
			scanf("%d", &a2[i]);
		for(int i=0; i<n; i++)
		{
			ans1 += score[a1[i % n1] ][a2[i % n2] ];
			ans2 += score[a2[i % n2] ][a1[i % n1] ];
		}
		printf("%d %d\n", ans1, ans2);
	}

	return 0;
}