USACO The Clocks

都说是个简单题,可能是我好久没编什么,退化了,连别人写的bfs,dfs都看不懂。悲剧!这个题我一开始想到直接枚举应该不会超时,因为只是4^9的规模。但是由于剪枝不会,位运算不会等一系列不会指挥果断悲剧。翻阅了无数解题报告之后竟然没看懂别人的意思。后来知道了答案只有一个根本无需判重,才在一个前辈的代码的帮助下勉强ac,悲剧的usaco,好难呀!bt题也不少。本代码主要参考别人的。

/*
ID: like_091
PROG: clocks
LANG: C++
*/
#include <iostream>
#include <fstream>
using namespace std;
int n[10], d[30];
int main()
{
	ifstream cin("clocks.in");
	ofstream cout("clocks.out");
	int k[10], a = 0;
	for (int i = 1; i <= 9; i++)
		cin>>n[i];
	for (k[1] = 0; k[1] <= 3; k[1]++)
	for (k[2] = 0; k[2] <= 3; k[2]++)
	for (k[3] = 0; k[3] <= 3; k[3]++)
	for (k[4] = 0; k[4] <= 3; k[4]++)
	for (k[5] = 0; k[5] <= 3; k[5]++)
	for (k[6] = 0; k[6] <= 3; k[6]++)
	for (k[7] = 0; k[7] <= 3; k[7]++)
	for (k[8] = 0; k[8] <= 3; k[8]++)
	for (k[9] = 0; k[9] <= 3; k[9]++)
	{
		if ((n[1] + 3 * (k[1] + k[2] + k[4])) % 12)
				continue;
		if ((n[2] + 3 * (k[1] + k[2] + k[3] + k[5])) % 12)
				continue;
		if ((n[3] + 3 * (k[2] + k[3] + k[6])) % 12)
				continue;
		if ((n[4] + 3 * (k[1] + k[4] + k[5] + k[7])) % 12)
				continue;
		if ((n[5] + 3 * (k[1] + k[3] + k[5] + k[7] + k[9])) % 12)
				continue;
		if ((n[6] + 3 * (k[3] + k[5] + k[6] + k[9])) % 12)
				continue;
		if ((n[7] + 3 * (k[4] + k[7] + k[8])) % 12)
				continue;
		if ((n[8] + 3 * (k[5] + k[7] + k[8] + k[9])) % 12)
				continue;
		if ((n[9] + 3 * (k[6] + k[8] + k[9])) % 12)
				continue;
		for (int i = 1; i <= 9; i++)
		{
			int t = k[i];
			while (t--)d[a++] = i;
		}
		for (int i = 0; i < a - 1; i++)
			cout<<d[i]<<" ";
		cout<<d[a - 1]<<endl;
	}
	return 0;
}
posted @ 2011-02-23 22:41  like@neu  阅读(300)  评论(0编辑  收藏  举报