USACO 1.3.4 Combination Lock

這題真是夠繁瑣,大概就是用一個三重循環去檢驗三個數字是否能夠滿足題目的要求。


題目概述:

這題是說給定兩個密碼,一個是農夫的,一個是系統自己的,都是三位有序數組。之後要求輸入的數字的密碼中的每一位都不和其中一個正確密碼相差兩位。

最後輸出這樣的密碼解的個數。

算法思想:

這道題我開始想盡量減少循環層數來着,就是說直接先檢驗第一個數,然後如果在第一個數滿足條件情況下檢查第二層循環。同時因爲一個可以匹配兩個密碼所以我一個循環下有兩個if。但是後來發現行不通,因爲可能有的密碼是同時滿足和農夫密碼相近也和系統密碼相近,這樣就會多數。嗯最後還是隨大流用了在最後一層判斷的方法。

簡而言之就是有一個函數單獨判斷兩個數字是不是相近,然後再在循環內部用and和or連接起來就夠了。

代碼部分:

#include <iostream>
#include <list>
#include <map>
#include <math.h>
#include <string.h>
#include <string>
#include <fstream>
#include <algorithm>
using namespace std;
ifstream fin("combo.in");
ofstream fout("combo.out");
int n;

bool judge(int x, int y) {
	int y1 = y - 2;
	if (y1 <= 0) y1 += n;
	int y2 = y - 1;
	if (y2 <= 0) y2 += n;
	int y3 = y + 1;
	if (y3 > n) y3 -= n;
	int y4 = y + 2;
	if (y4 > n) y4 -= n;
	if (x == y1 || x == y2 || x == y3 || x == y4 || x == y) {
		return true;
	}
	return false;
}

int main() {
	int res = 0;
	int a1, a2, a3, b1, b2, b3;
	fin >> n;
	fin >> a1 >> a2 >> a3 >> b1 >> b2 >> b3;
	for (int i1 = 1; i1 <= n; i1++) {
		for (int i2 = 1; i2 <= n; i2++) {
			for (int i3 = 1; i3 <= n; i3++) {
				if ( (judge(i1, a1) && judge(i2, a2) && judge(i3, a3) ) || (judge(i1, b1) && judge(i2, b2) && judge(i3, b3))) res++;
			}
		}
	}
	fout << res << endl;
	
	return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章