- toc {:toc}
λ¬Έμ νμΈνκΈ°
1039: κ΅ν λ¬Έμ νμΈνκΈ°
νμ΄
μ°μ° μ체λ i μ j λ₯Ό κ³¨λΌ swap νλ κ°λ¨ν μ°μ°μ΄λ€. λ€μμ μ°μ°μ K λ² μ§ννμ¬ λμ¬ μ μλ μ΅λκ°μ ꡬνλ λ¬Έμ μ΄λ€. μ΄λ, μ§μ€ν΄μ λ΄μΌν μ μ K λ²μ μ§ννλ€λ λΆλΆμ΄λ€.
- μ£Όμ΄μ§ μ°μ°μ K λ² νμ λ, λ§λ€ μ μλ κ°μ₯ ν° μ
- 1~K λ² μ°μ°μ μ§ν μ€ λμ¬ μ μλ κ°μ₯ ν° μ
- K λ²μ§Έ μ°μ°μ νμ λ λμ¬ μ μλ κ²½μ°μ μμμ κ°μ₯ ν° μ
λ€μ 1, 2 λ² μ€ μ΄λ€ κ²μ μλ―Έν κΉ?
ν΄λΉ λ¬Έμ λ 2 λ²μ μλ―Ένλ€.
λλ¬Έμ K λ²μ μ°μ°μ λ°λμ μ§νν΄μΌ νλ―λ‘ level μ ν΅ν΄ ν΄λΉ κ³μ°μ΄ λͺ λ² μ°μ°λλμ§ νμΈνλ€. λͺ¨λ κ²½μ°μ μλ₯Ό νμΈν΄μΌ νκΈ°μ BFS λ₯Ό μ¬μ©νκ³ λ°©λ¬Ένμ κ²½μ° λ°©λ¬Έ μ¬λΆλ₯Ό 체ν¬νλ€. μ΄ν K λ² μ°μ°ν κ²μ λ°λ‘ max_q μ μ μ₯ν΄λκ³ max_q μμ κ°μ₯ ν° μλ₯Ό λ°ννλ€.
#include <bits/stdc++.h>
using namespace std;
int depth[1000001];
int visit[1000001] = {};
string N;
int res = 0, K, level=0;
queue<pair<string, int>> q;
queue<int> max_q;
string Swap(string str, int i, int j){
char temp;
temp = str[i];
str[i] = str[j];
str[j] = temp;
return str;
}
void bfs(){
int stage = 0;
while(q.empty()==0){
string str = q.front().first;
level = q.front().second;
if (stage != level) {
stage = level;
fill(visit, visit+1000001, 0);
}
if (level == K) {
max_q.push(stoi(str));
q.pop();
continue;
}
for(int i=0; i<N.size()-1; i++){
for(int j=i+1; j<N.size(); j++){
string change = str;
if(i==0 && str[j] == '0') continue;
change = Swap(str, i, j);
int val = stoi(change);
// λ°©λ¬Έ μ¬λΆ νμΈ
if (!visit[val]){
visit[val] = 1;
q.push({change, level+1});
}
}
}
q.pop();
}
}
int main(){
ios::sync_with_stdio(true);
cin.tie(0); cout.tie(0);
cin >> N >> K;
q.push({N, 0});
if (K==0){
cout << N << endl;
exit(0);
}
else if (N.size() == 1 || (N.size() == 2 && stoi(N) % 10 == 0)){
cout << -1 << endl;
exit(0);
}
bfs();
while(!max_q.empty()){
if(res < max_q.front()){
res = max_q.front();
}
max_q.pop();
}
cout << res << endl;
return 0;
}