P1132迭代加深40分,3个TLE
#include<bits/stdc++.h>
using namespace std;
//检查数字字符串是否有效(不包含0)
bool isValid(const string& num)
{
return num.find('0')==string::npos;
}
vector<string> nxtnum(const string& num,int maxLen)//生成下一个可能的数字
{
vector<string> result;
int n=num.size();
//规则1:交换任意两位
for(int i=0;i<n;i++)
{
for(int j=i+1;j<n;j++)
{
string newNum=num;
swap(newNum[i],newNum[j]);
if(isValid(newNum))
result.push_back(newNum);
}
}
//规则2:删除任意一位
for(int i=0;i<n;i++)
{
string newNum=num.substr(0,i)+num.substr(i+1);
if(isValid(newNum))
result.push_back(newNum);
}
//规则3:在相邻两位之间插入一个数字
if(n<maxLen)
for(int i=0;i<n-1;i++)
for(char c=num[i]+1;c<num[i+1];++c)
{
string newNum=num.substr(0,i+1)+c+num.substr(i+1);
if(isValid(newNum))
result.push_back(newNum);
}
return result;
}
int iddfs(const string& start,const string& target,int maxLen)
{
for(int depth=0;depth<=30;depth++)
{
unordered_set<string> visited;
queue<pair<string,int>> q;
q.push({start,0});
visited.insert(start);
while(!q.empty())
{
string current=q.front().first;
int steps=q.front().second;
q.pop();
if(current==target)
return steps;
if(steps==depth)
continue;
for(const string&next:nxtnum(current,maxLen))
if(visited.find(next)==visited.end())
{
visited.insert(next);
q.push({next,steps+1});
}
}
}
return -1;
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
string s;
cin>>s;
int maxLen=s.size();
int m;
cin>>m;
while(m--)
{
string t;
cin>>t;
cout<<iddfs(s,t,maxLen)<<endl;
}
return 0;
}