Official

C - 良さそうな数 / Goodish or Not Editorial by physics0523


\(N\)\(18\) 桁以内であることから、「 \(N\) のうち高々 \(1\) 桁以下書き換える」方法は雑に見積もっても \(180\) 通り以下しかありません。よって、これらを全探索することを考えます。

この全探索は、「書き換える桁」「書き換えた後のその桁の値」で 2 重 for ループを回し、その中で書き換えた後の整数が良い整数かどうか判定すれば実現可能です。

実装の際は、 \(N\) を数値としてではなく文字列として受け取っておくと特定の桁を書き換えるという操作が便利になります。
なお、隣接する桁の差を求める際に文字コードが利用できる場合は利用すると楽に実装できます。

実装例 (C++):

#include<bits/stdc++.h>

using namespace std;

int main(){
  string n;
  cin >> n;
  for(int i=0;i<n.size();i++){
    for(char j='0';j<='9';j++){
      if(i==0 && j=='0'){continue;}
      string m=n;
      m[i]=j;
      bool ok=true;
      for(int k=1;k<m.size();k++){
        if(abs(m[k-1]-m[k])>1){ok=false; break;}
      }
      if(ok){
        cout << "Yes\n";
        return 0;
      }
    }
  }
  cout << "No\n";
  return 0;
}

posted:
last update: