Viene fornita una matrice di numeri interi in cui tutti gli elementi sono compresi tra 0 e 9. Deve iniziare dalla 1a posizione e raggiungere la fine nel minimo numero di mosse tale che possiamo da un indice spostare 1 posizione indietro e avanti i.i i-1 e i + 1 e passare a qualsiasi indice avente lo stesso valore dell'indice i.
Limite di tempo: 1 secondo
Dimensione massima dell'input: 100000
Ho provato a risolvere questo problema utilizzando un approccio a percorso singolo a sorgente più corta usando la ricerca di ampiezza prima e sebbene BFS sia di per sé O (V + E) e funzioni nel tempo, la creazione della lista di adiacenze richiede tempo O (n2) e quindi complessità complessiva diventa O (n2). c'è un modo per diminuire la complessità temporale della creazione della lista di adiacenza? o c'è un modo migliore e più efficace per risolvere il problema?
int main(){
vector<int> v;
string str;
vector<int> sets[10];
cin>>str;
int in;
for(int i=0;i<str.length();i++){
in=str[i]-'0';
v.push_back(in);
sets[in].push_back(i);
}
int n=v.size();
if(n==1){
cout<<"0\n";
return 0;
}
if(v[0]==v[n-1]){
cout<<"1\n";
return 0;
}
vector<int> adj[100001];
for(int i=0;i<10;i++){
for(int j=0;j<sets[i].size();j++){
if(sets[i][j]>0)
adj[sets[i][j]].push_back(sets[i][j]-1);
if(sets[i][j]<n-1)
adj[sets[i][j]].push_back(sets[i][j]+1);
for(int k=j+1;k<sets[i].size();k++){
if(abs(sets[i][j]-sets[i][k])!=1){
adj[sets[i][j]].push_back(sets[i][k]);
adj[sets[i][k]].push_back(sets[i][j]);
}
}
}
}
queue<int> q;
q.push(0);
int dist[100001];
bool visited[100001]={false};
dist[0]=0;
visited[0]=true;
int c=0;
while(!q.empty()){
int dq=q.front();
q.pop();
c++;
for(int i=0;i<adj[dq].size();i++){
if(visited[adj[dq][i]]==false){
dist[adj[dq][i]]=dist[dq]+1;
visited[adj[dq][i]]=true;
q.push(adj[dq][i]);
}
}
}
cout<<dist[n-1]<<"\n";
return 0;
}