P9752密码锁
  • 板块学术版
  • 楼主fnegyi
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/10/15 20:13
  • 上次更新2024/10/15 21:43:29
查看原帖
P9752密码锁
1464352
fnegyi楼主2024/10/15 20:13

各位大佬求指点

include <iostream>
#include <cmath>  // 用于 abs
using namespace std;

// 检查是否可以通过一次转动从正确密码 a 变为状态 b
bool check(int a[], int b[]) {
    int diffCount = 0;  // 记录不同位数的数量
    int pos1 = 0, pos2 = 0;  // 记录两个不同位的位置

    for (int i = 0; i < 5; i++) {
        if (a[i] != b[i]){
            diffCount++;
            if (diffCount == 1) {
                pos1 = i;
            }
            else if (diffCount == 2) {
                pos2 = i;
                // 检查两个不同位是否相邻
                if (abs(pos1 - pos2) != 1) return false;
            }
            else {
                return false;  // 超过 2 个不同位,返回 false
            }
            
        }
    }
    return true;  // 满足条件,返回 true
}

int main() {
    int n;  // 输入状态的数量
    cin >> n;

    int states[100][5];  // 使用二维数组存储最多 100 个状态

    // 读取所有状态,并拆解为数组形式
    for (int k = 0; k < n; k++) {
        int x;
        cin >> x;
        states[k][0] = x / 10000;
        states[k][1] = (x % 10000) / 1000;
        states[k][2] = (x % 1000) / 100;
        states[k][3] = (x % 100) / 10;
        states[k][4] = x % 10;
    }

    int validPasswords = 0;  // 记录符合条件的正确密码数量

    // 遍历所有可能的 5 位数作为正确密码
    for (int i = 0; i <= 99999; i++) {
        int a[5];  // 将当前数字拆解为数组形式
        a[0] = i / 10000;
        a[1] = (i % 10000) / 1000;
        a[2] = (i % 1000) / 100;
        a[3] = (i % 100) / 10;
        a[4] = i % 10;

        bool isValid = true;

        // 检查该密码是否能生成所有状态
        for (int k = 0; k < n; k++) {
            if (!check(a, states[k])) {
                isValid = false;
                break;
            }
        }

        if (isValid) validPasswords++;  // 如果满足条件,计数加 1
    }

    // 输出符合条件的正确密码数量
    cout << validPasswords << endl;

    return 0;
}

p9752密码锁的程序,我的思路是:对比所有位数如果这整个数字里就有一位不相同那就加一个如果两位不相同对比两位的位置是否相邻然如果相邻加一但是最后输出结果是370呜呜呜呜求指导

2024/10/15 20:13
加载中...