现在的位置: 首页 > 综合 > 正文

USACO 1.3.4 Combination Lock

2017年10月16日 ⁄ 综合 ⁄ 共 990字 ⁄ 字号 评论关闭

这题真是够繁琐,大概就是用一个三重循环去检验三个数字是否能够满足题目的要求。

题目概述:

这题是说给定两个密码,一个是农夫的,一个是系统自己的,都是三位有序数组。之后要求输入的数字的密码中的每一位都不和其中一个正确密码相差两位。

最后输出这样的密码解的个数。

算法思想:

这道题我开始想尽量减少循环层数来着,就是说直接先检验第一个数,然后如果在第一个数满足条件情况下检查第二层循环。同时因为一个可以匹配两个密码所以我一个循环下有两个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;
}

抱歉!评论已关闭.