UVa 296 - Safebreaker

猜数字游戏,直接从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;
}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值