猜数字游戏,直接从0开始枚举到9999,我的方法很笨。因为只有0~9十位数字,所以用了5层循环。在匹配的时候,先是对应位置匹配,用flag和opt分别记录位置ll猜的数字和枚举的数字i*1000+j*100+k*10+l这个数的对应位置是否已经配对。如果符合情况用ans记录
/*************************************************************************
> File Name: 269.cpp
> Author: Toy
> Mail: ycsgldy@163.com
> Created Time: 2013年05月31日 星期四 13时40分52秒
************************************************************************/
#include <algorithm>
#include <iostream>
#include <iomanip>
#include <cstring>
#include <cstdlib>
#include <climits>
#include <sstream>
#include <fstream>
#include <cstdio>
#include <string>
#include <vector>
#include <queue>
#include <cmath>
#include <stack>
#include <map>
#include <set>
using namespace std;
const int INF = 0x7fffffff;
int Case, num, n[15], m[15], ans[10010][15], cc;
char s[15][15];
int main ( ) {
//freopen ( "input.txt", "r", stdin );
//freopen ( "output.txt", "w", stdout );
scanf ( "%d", &Case );
while ( Case-- ) {
scanf ( "%d", &num );
for ( int i = 1; i <= num; ++i )
scanf ( "%s %d/%d", s[i], &n[i], &m[i] );
bool flag[10], opt[10];
int cnt = 0;
for ( int i = 0; i <= 9; ++i )
for ( int j = 0; j <= 9; ++j )
for ( int k = 0; k <= 9; ++k )
for ( int l = 0; l <= 9; ++l ) {
cc = 0;
for ( int ll = 1; ll <= num; ++ll ) {
int tmp1 = 0, tmp2 = 0;
memset ( flag, 0, sizeof ( flag ) );
memset ( opt, 0, sizeof ( opt ) );
if ( i == s[ll][0] - '0' ) tmp1++, flag[0] = 1, opt[0] = 1;
if ( j == s[ll][1] - '0' ) tmp1++, flag[1] = 1, opt[1] = 1;
if ( k == s[ll][2] - '0' ) tmp1++, flag[2] = 1, opt[2] = 1;
if ( l == s[ll][3] - '0' ) tmp1++, flag[3] = 1, opt[3] = 1;
if ( !opt[0] ) {
if ( i == s[ll][1] - '0' && !flag[1] ) tmp2++, flag[1] = 1;
else if ( i == s[ll][2] - '0' && !flag[2] ) tmp2++, flag[2] = 1;
else if ( i == s[ll][3] - '0' && !flag[3] ) tmp2++, flag[3] = 1;
}
if ( !opt[1] ) {
if ( j == s[ll][0] - '0' && !flag[0] ) tmp2++, flag[0]= 1;
else if ( j == s[ll][2] - '0' && !flag[2] ) tmp2++, flag[2] = 1;
else if ( j == s[ll][3] - '0' && !flag[3] ) tmp2++, flag[3] = 1;
}
if ( !opt[2] ) {
if ( k == s[ll][0] - '0' && !flag[0] ) tmp2++, flag[0] = 1;
else if ( k == s[ll][1] - '0' && !flag[1] ) tmp2++, flag[1] = 1;
else if ( k == s[ll][3] - '0' && !flag[3] ) tmp2++, flag[3] = 1;
}
if ( !opt[3] ) {
if ( l == s[ll][0] - '0' && !flag[0] ) tmp2++, flag[0] = 1;
else if ( l == s[ll][1] - '0' && !flag[1] ) tmp2++, flag[1] = 1;
else if ( l == s[ll][2] - '0' && !flag[2] ) tmp2++, flag[2] = 1;
}
if ( tmp1 == n[ll] && tmp2 == m[ll] ) cc++;
}
if ( cc == num ) {
ans[cnt][0] = i, ans[cnt][1] = j, ans[cnt][2] = k, ans[cnt][3] = l;
cnt++;
break;
}
}
if ( cnt == 0 ) printf ( "impossible\n" );
else if ( cnt == 1 ) printf ( "%d%d%d%d\n", ans[0][0], ans[0][1], ans[0][2], ans[0][3] );
else printf ( "indeterminate\n" );
}
return 0;
}