密密麻麻密码锁(暴力)

题目描述
琪露诺,雾之湖畔最强的妖精,长久以来早已感到高手寂寞。因此她决定要环游世界,向各地的强者发起挑战来砥砺自己。为了保护心爱的行李箱,她使用了高强度的六位数密码锁,每位有0到9共十种可能,且每位数可以独立转动,如9转一下可以变成8或0。这个密码锁总共有000000到999999整整一百万种可能的密码。
但很不幸的,出发没多久后她就忘了自己行李箱的密码。看着密码锁回忆许久的她,只记得当初设定的密码六位数均相异,而且出门的时候只有随意稍微拨乱,所以正确的密码很可能跟当前显示的密码相去不远。
身为《9章算术》的作者,聪明的她想到了一个办法:「先来试试最有可能的密码吧!也就是所有跟当前密码最相近且六位数均相异的密码」,所谓的最相近也就是所需转动次数最少的意思。假设当前密码为991234,则有四个只需转动一下的可能密码:091234、891234、901234及981234。
转着转着,琪露诺的头就晕了。好心的你决定写个程序帮帮她找出最有可能的密码列表。

输入
一行,包含一个六位数字表示当前密码锁上显示的密码。

输出
输出一行,包含以空白隔开的两个整数 n,d,代表有 n 个最有可能的密码,以及最少需要转动 d 下。
接下来请输出一行,包含 n 个六位数字,代表最有可能的密码列表。密码列表中的密码请依序由小到大输出,密码间恰由一个空白隔开。

样例输入
【输入样例1】
991234

【输入样例2】
123456

【输入样例3】
118827

样例输出
【输出样例1】
4 1
091234 891234 901234 981234

【输出样例2】
1 0
123456

【输出样例3】
4 2
018927 019827 108927 109827

思路
暴力枚举所有密码组合形式,找变化最小的即可

代码实现

扫描二维码关注公众号,回复: 10960412 查看本文章
#pragma GCC optimize(3,"Ofast","inline")
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int N=2005;
const int M=10;
const int INF=0x3f3f3f;
const ull sed=31;
const ll mod=1e9+7;
const double eps=1e-8;
const double PI=acos(-1.0);
typedef pair<int,int>P;
 
vector<string>v,ans;
string s;
bool vis[10];
 
void dfs(string t)
{
    if(t.size()==6)
    {
        //cout<<t<<endl;
        v.push_back(t);
        return ;
    }
    for(int i=0;i<10;i++)
    {
        if(vis[i]) continue;
        vis[i]=true;
        dfs(t+=(i+'0'));
        t.pop_back();
        vis[i]=false;
    }
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    cin>>s;
    dfs("");
    int minx=INF;
    for(int i=0;i<v.size();i++)
    {
        int tmp=0;
        for(int j=0;j<6;j++)
        {
            tmp+=min(abs(v[i][j]-s[j]),min(s[j]+10-v[i][j],v[i][j]+10-s[j]));
        }
        if(tmp<minx)
        {
            minx=tmp;
            ans.clear();
            ans.push_back(v[i]);
        }
        else if(tmp==minx) ans.push_back(v[i]);
    }
    sort(ans.begin(),ans.end());
    cout<<ans.size()<<' '<<minx<<endl;
    for(int i=0;i<ans.size();i++)
    {
        if(i) cout<<" ";
        cout<<ans[i];
    }
    cout<<endl;
    return 0;
}
发布了235 篇原创文章 · 获赞 13 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_43935894/article/details/104187569