求助,迭代加深40pts,三个tle
查看原帖
求助,迭代加深40pts,三个tle
1122958
yyz38楼主2024/8/4 10:36
#include<bits/stdc++.h> 
using namespace std;
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();
    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);
        }
    }
    for(int i=0;i<n;i++) 
	{
        string newNum=num.substr(0,i)+num.substr(i+1);
        if(isValid(newNum)) 
			result.push_back(newNum);
    }
    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<=15;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;
}
2024/8/4 10:36
加载中...