この質問は、出発点からして、座標X2または別の+1や-1の後に抽象化についてです。これは明らかに探索問題である、と明らかにそれは2点の座標との差にまでステップ数いることがわかります。しかし、10のデータ範囲5、直接的エクスポージャー確かMLE検索やTLE、確かではないが、最適化を追加してください。
私たちは、0,10(座標の範囲があることに注意してください5、明らかに解決するので、直接剪定なかっただろう、この範囲外の地点まで延長ます。私たちは、BFSの検索を使用するように、明らかに検索するための最初の時間のために、]そのポイントは、この時点までのステップの最小数である必要があり、再度このポイントに到達し、その後、いくつかのメモリを考えて、それを再度検索する必要はありません。
だから、最後の食事の剪定作業がシミュレートされた条件が少ない原因MLEqwqを剪定する場合ので、問題を提示することができます。
書式#include <cstdioを> する#include <cstdlib> 書式#include <アルゴリズム> 書式#include <CStringの> の#include <キュー> 使用して 名前空間はstdを、 int型の D [ 100010 ]。 ブールチェック(int型x)は { 返すのx> 0 && X < 100000 &&!D [X]。 } INT S、T。 構造体qwq { int型のx、ステップと }上; ボイドBFS() { キュー <qwq> Q。 q.push((qwq){S、1}); D [S] = 1 。 一方、(q.size()) { トップ = q.front()。 q.pop(); もし(top.x == t)が復帰。 もし(チェック(top.x + 1 )) { q.push((qwq){top.x + 1、top.step + 1 })。 D [top.x + 1 ] = top.step + 1 。 } であれば(チェック(top.x - 1 )) { q.push((qwq){top.x -1、top.step + 1 })。 D [top.x - 1 ] = top.step + 1 。 } であれば(チェック(top.x << 1 )) { q.push((qwq){top.x << 1、top.step + 1 })。 D [top.x << 1 ] = top.step + 1 。 } } } int型のmain() { int型TT。 scanf関数(" %のD "、およびTT); 一方、(tt-- ) { scanf関数(" %D%D "、&S&T)。 memsetの(D、0、はsizeof (d)参照)。 BFS(); printf(" %d個の\ n "、D [T] - 1 )。 } 戻り 0 。 }