[Algorithm]¥ٵٵٵٵB
0、問題
整数AをBに変えたいです.可能な演算は次の2つです.
2を掛ける.
数の一番右に1を追加します.
AからBまでの演算の最大値を求める.
入力
第1行は、A、B(1≦Aしゅつりょく
AをBに変換するために必要な演算の最大値に1を加算して出力します.作成できない場合は、-1を出力します.
1.アイデア
💡 BFS
💡 キューを使用して2つの演算を実行する場合は、B以下の数をキューに入れます.
💡 キュー内の数値がBに等しい場合、その数値が返されます.
💡 キュー内の数字がすべて表示されますが、Bと等しくない場合は-1を返します.
2.コア解答
if(cur.num*2 <= B) {
q.add(new Cal(cur.num*2, cur.cnt+1));
}
if(cur.num*10+1 <= B) {
q.add(new Cal(cur.num*10+1, cur.cnt+1));
}
if(cur.num == B)
return cur.cnt+1;
while(!q.isEmpty()){
...
}
return -1;
3.コード
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
public class Bruteforce_8 {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] s = br.readLine().split(" ");
long A = Long.parseLong(s[0]);
long B = Long.parseLong(s[1]);
System.out.println(bfs(A,B));
}
static int bfs(long A, long B) {
Queue<Cal> q = new LinkedList<>();
q.add(new Cal(A,0));
while(!q.isEmpty()) {
Cal cur = q.poll();
if(cur.num == B)
return cur.cnt+1;
if(cur.num*2 <= B) {
q.add(new Cal(cur.num*2, cur.cnt+1));
}
if(cur.num*10+1 <= B) {
q.add(new Cal(cur.num*10+1, cur.cnt+1));
}
}
return -1;
}
static class Cal{
long num;
int cnt;
Cal(long num, int cnt){
this.num = num;
this.cnt = cnt;
}
}
}
4.結果
成功
あまり時間がかからなかったので、2回間違えました.😥
Reference
この問題について([Algorithm]¥ٵٵٵٵB), 我々は、より多くの情報をここで見つけました https://velog.io/@kha0318/Algorithm-백준-16953-A-Bテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol