340 - Master-Mind Hints

题意:
猜数字, 先输入一串 secret, 再输入一串 guess, 比较 guess 与 secret 中的每一位, 若两个字母相同, 且位置相同, 则定义为 strong; 若字母相同, 但位置不同, 则定义为 weak; 最后输出 strong 与 weak 的对数.
注: 本来很简单的题目, 由于理解错题意, 想成需要从 secret 和 guess 里取最多的 strong 和 weak 对, 结果一直没能AC. 

思路:
1. 优先配对 strong, 把所有配对过的地方都标为 -1, 以防再次被配对.
2. 配对 weak, 每找到一个 weak 对, 都把配对过的地方标为 -1, 以防再次被配对.

要点:
使用 count(guess.begin(), guess.end(), 0) 来计算 0 出现的次数.

题目:
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=98&page=show_problem&problem=276

代码:

# include <iostream>
# include <string>
# include <cstdio>
# include <cstring>
# include <vector>
# include <algorithm>
# include <cctype>
# include <iterator>
# include <assert.h>
using namespace std;

// 使用 count 计算 0 出现的次数

// 就是猜数字, 如果有一个数在 s 和 g 中都出现(下标分别为 i, j), 若 i == j, 则为 strong
// 若 i != j, 则为 weak, 每个下标只计算一次(即每次猜的数都要得出他是 strong 还是 weak)

int main(int argc, char const *argv[])
{
  #ifndef ONLINE_JUDGE
    freopen ("340_i.txt", "r", stdin);  
    freopen ("340_o.txt", "w", stdout); 
  #endif
  

  int numGame = 0;
  int codeLength = 0;

  while (true) {
    cin >> codeLength;
    if (codeLength == 0) 
      break;
    
    cout << "Game " << ++numGame << ":" << endl;

    vector<int> secret(codeLength);
    vector<int> guess(codeLength);

    for (int i=0; i<codeLength; i++) {
      cin >> secret[i];
    }

    while (true) {
      for (int i=0; i<codeLength; i++) {
        cin >> guess[i];
      }

      // 如果全是0, 则说明 guess 结束
      if (codeLength == count(guess.begin(), guess.end(), 0)) 
        break;

      int strong = 0;
      int weak = 0;
      vector<int> secretTemp(secret);

      // 所有配对过的地方都设置为 -1, 防止以后再进行配对
      // 优先配对 strong, 再配对 weak
      for (int i=0; i<codeLength; i++) {
        if (secretTemp[i] == guess[i]) {
          secretTemp[i] = -1;
          guess[i] = -1;
          ++strong;
        } 
      }

      for (int i=0; i<codeLength; i++) {
        if (guess[i] != -1) { 
          for (int j=0; j<codeLength; j++) {
            if (secretTemp[j] == guess[i]) {
              guess[i] = -1;
              secretTemp[j] = -1;
              ++weak;
              break;
            }
          }
        }
      }

      printf("    (%d,%d)\n", strong, weak);
    }

  }

  return 0;
}

环境: C++ 4.5.3 - GNU C++ Compiler with options: -lm -lcrypt -O2 -pipe -DONLINE_JUDGE

你可能感兴趣的:(Hints,uva,MasterMind,340)