无数次的愤怒后,决定裸搜sgu 125,结果23ms AC... /* * $File: 125.cpp * $Date: Thu Aug 20 22:28:36 2009 */ #include <cstdio> namespace Solve { const char *NO_SOL = "NO SOLUTION"; void solve(FILE *fin, FILE *fout); }; void Solve::solve(FILE *fin, FILE *fout) { int n; fscanf(fin, "%d", &n); if (n == 1) { int b11; fscanf(fin, "%d", &b11); if (b11) fprintf(fout, "%s/n", NO_SOL); else fprintf(fout, "0/n"); return; } #define FOR(_suffix_) for (int a##_suffix_ = 1; a##_suffix_ <= 9; a##_suffix_ ++) #define C(_a_, _b_) (int)(a##_a_ > a##_b_) if (n == 2) { int b11, b12, b21, b22; fscanf(fin, "%d %d", &b11, &b12); fscanf(fin, "%d %d", &b21, &b22); FOR(11) FOR(12) FOR(21) if (C(21, 11) + C(12, 11) == b11) FOR(22) if (C(11, 12) + C(22, 12) == b12 && C(11, 21) + C(22, 21) == b21 && C(12, 22) + C(21, 22) == b22) { fprintf(fout, "%d %d/n", a11, a12); fprintf(fout, "%d %d/n", a21, a22); return; } fprintf(fout, "%s/n", NO_SOL); return; } int b11, b12, b13, b21, b22, b23, b31, b32, b33; fscanf(fin, "%d %d %d", &b11, &b12, &b13); fscanf(fin, "%d %d %d", &b21, &b22, &b23); fscanf(fin, "%d %d %d", &b31, &b32, &b33); FOR(11) FOR(12) FOR(21) if (C(21, 11) + C(12, 11) == b11) FOR(13) FOR(23) if (C(12, 13) + C(23, 13) == b13) FOR(22) if (C(11, 12) + C(13, 12) + C(22, 12) == b12 && C(12, 22) + C(21, 22) + C(23, 22) <= b22 && C(11, 21) + C(22, 21) <= b21 && C(13, 23) + C(22, 23) <= b23) FOR(32) if (C(12, 22) + C(21, 22) + C(23, 22) + C(32, 22) == b22) FOR(31) if (C(21, 31) + C(32, 31) == b31 && C(31, 21) + C(22, 21) + C(11, 21) == b21) FOR(33) if (C(13, 23) + C(22, 23) + C(33, 23) == b23 && C(23, 33) + C(32, 33) == b33 && C(31, 32) + C(33, 32) + C(22, 32) == b32) { fprintf(fout, "%d %d %d/n", a11, a12, a13); fprintf(fout, "%d %d %d/n", a21, a22, a23); fprintf(fout, "%d %d %d/n", a31, a32, a33); return; } fprintf(fout, "%s/n", NO_SOL); #undef FOR #undef C } int main() { Solve::solve(stdin, stdout); }