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