小明完成了這樣乙個數字生成遊戲,對於乙個不包含0的數字s來說,有以下3種生成新的數的規則:
將s的任意兩位對換生成新的數字,例如143可以生成314,413,134;
將s的任意一位刪除生成新的數字,例如143可以生成14,13,43
在s的相鄰兩位之間s[i],s[i + 1]之間插入乙個數字x,x需要滿足s[i] < x < s[i + 1]。例如143可以生成1243,1343,但是不能生成1143,1543等。
現在小明想知道,在這個生成法則下,從s開始,每次生成乙個數,可以用然後用新生成的數生成另外乙個數,不斷生成直到生成t至少需要多少次生成操作。
另外,小明給規則3又加了乙個限制,即生成數的位數不能超過初始數s的位數。若s是143,那麼1243與1343都是無法生成的;若s為1443,那麼可以將s刪除4變為143,再生成1243或1343。
輸入格式:
輸入的第一行包含1個正整數,為初始數字s。
第2行包含乙個正整數m,為詢問個數。
輸出格式:
輸出包括m行,每行乙個正整數,對每個詢問輸出最少運算元,如果無論。
輸入樣例#1:
1433134
13332
輸出樣例#1:
1-14
143 -> 134
133無法得到
143 -> 13 -> 123 -> 23 -> 32
對於20%的資料,s < 100;
對於40%的資料,s < 1000;
對於40%的資料,m < 10;
對於60%的資料,s < 10000;
對於100%的資料,s < 100000,m ≤ 50000。
/*bfs,模擬三種操作
*/#include
#include
#include
#include
using
namespace
std;
intn,m;
int s[10],l1,h,f[100010
];bool vis[100010
];struct
nodecur,nxt;
intbfs()
//把即將要轉換的數變成陣列
for(int i=1;i<=l2;i++)
swap(ss[i],ss[j]);}}
for(int i=1;i<=l2;i++)
nxt.step=cur.step+1
; nxt.x=y;
if(!vis[nxt.x])
}if(l2//
可以插數字
for(int i=1;i<=l2-1;i++)
*/for(int k=l2;k>i;k--)
y=y*10+ss[k];
y=y*10+j;
for(int k=i;k>=1;k--)
y=y*10+ss[k];
nxt.x=y;
nxt.step=cur.step+1
;
if(!vis[nxt.x]) }}
}}
return -1;}
intmain()
inth;bfs();
for(int i=1;i<=m;i++)
return0;
}
P1132 數字生成遊戲
小明完成了這樣乙個數字生成遊戲,對於乙個不包含00的數字ss來說,有以下33種生成新的數的規則 將ss的任意兩位對換生成新的數字,例如143143可以生成314,413,134314,413,134 將ss的任意一位刪除生成新的數字,例如143143可以生成14,13,4314,13,43 在ss的...
洛谷P1043 數字遊戲
丁丁最近沉迷於乙個數字遊戲之中。這個遊戲看似簡單,但丁丁在研究了許多天之後卻發覺原來在簡單的規則下想要贏得這個遊戲並不那麼容易。遊戲是這樣的,在你面前有一圈整數 一共n個 你要按順序將其分為m個部分,各部分內的數字相加,相加所得的m個結果對10取模後再相乘,最終得到乙個數k。遊戲的要求是使你所得的k...
洛谷P1043數字遊戲
題目 區間dp,將 maxn i j k 表示為i到j區間內分為k個區間所得到的最大值,minn 表示最小值。然後可以得到狀態轉移方程 maxn i j k max maxn i j k maxn i l k 1 l到j的 10後的和 然後判斷一下邊界就能得到最終答案。c include using...