大致思路:如果当前状态和某条记录一致,return -1。
#include <iostream>
#include <cmath>
#include <ctime>
#include <climits>
#include <iomanip>
#include <cstring>
#include <sstream>
#include <algorithm>
#define LOCAL_DEBUG
using namespace std;
int a[20], b[20], c[20];
int record[1000000][20][3], recPtr, n;
int iterate()
{
int min = 1;
recPtr = 0;
while (true)
{
int cnt = 0;
for (int i = 0; i < n; i++)
if (c[i] <= a[i])
cnt++;
if (cnt == n)
return min;
for (int i = 0; i < recPtr; i++)
{
int flag = true;
for (int j = 0; j < n; j++)
if (record[i][j][0] != a[j] || record[i][j][1] != b[j] || record[i][j][2] != c[j])
{
flag = false;
break;
}
if (flag)
return -1;
}
for (int j = 0; j < n; j++)
{
record[recPtr][j][0] = a[j];
record[recPtr][j][1] = b[j];
record[recPtr][j][2] = c[j];
}
recPtr++;
for (int i = 0; i < n; i++)
{
if (c[i] == a[i] + b[i] || c[i] == a[i] && cnt >= n - cnt)
c[i] = 0;
c[i]++;
}
min++;
}
}
int main()
{
#ifdef LOCAL_DEBUG
freopen("sample.in", "r", stdin);
freopen("sample.out", "w", stdout);
#endif
cin.tie(0);
ios::sync_with_stdio(false);
int kase = 0;
while (cin >> n && n)
{
for (int i = 0; i < n; i++)
cin >> a[i] >> b[i] >> c[i];
cout << "Case " << ++kase << ": " << iterate() << endl;
}
//end of programs
return 0;
}