← 返回题目页

A1443 象棋游戏

标程

// A1443 象棋游戏 —— 统计不同棋子的种类数
//
// 结论:把 4 枚棋子变成完全相同,最少操作次数 = 不同种类数 k - 1。
//   k = 1(全同)        -> 0 次
//   k = 2(3+1 或 2+2)  -> 1 次
//   k = 3(2+1+1)       -> 2 次
//   k = 4(全不同)      -> 3 次
//
// 操作一:换 1 枚棋子(代价 1);操作二:把 2 枚相同的棋子同时换成另一种(代价 1)。

#include <bits/stdc++.h>
using namespace std;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int n;
    cin >> n;
    while (n--) {
        char piece[4];
        for (int i = 0; i < 4; i++) cin >> piece[i]; // 每组 4 枚棋子(两行两个字母)

        vector<char> kinds; // 已经数过的棋子种类
        for (int i = 0; i < 4; i++) {
            bool seen = false;
            for (int j = 0; j < (int)kinds.size(); j++) {
                if (kinds[j] == piece[i]) {
                    seen = true;
                    break;
                }
            }
            if (!seen) kinds.push_back(piece[i]); // 遇到新种类就记下来
        }

        cout << (int)kinds.size() - 1 << '\n';
    }
    return 0;
}

动画演示