1167. 【宽度优先搜索BFS】数字交换游戏(保姆教程)(打破垄断)
文章目录
- 题目描述
- 输入
- 输出
- 样例输入
- 样例输入1
- 样例输入2
- 样例输入3
- 样例输出
- 样例输出1
- 样例输出2
- 样例输出3
- AC代码
题目描述
小明已经是中学生了,他喜欢研究数字,觉得最漂亮的数就是整数了。一次小明写下一个M位的整数(无前导0),他想研究下面这个游戏:每次取其中两位交换,会得到一个新的整数------但不能有前导0出现,即第一位不能变成0。这样连续做K次,最后能得到的最大整数是多少?
输入
第一行:两个整数N(1<=N<=1000000)和K(1<=K<=10)
输出
只有一行,一个整数,表示变化后最大数,如果不能变换则输出-1
样例输入
样例输入1
16375 1
样例输入2
432 1
样例输入3
90 4
样例输出
样例输出1
76315
样例输出2
423
样例输出3
-1
AC代码
#include <stdio.h>
#include <algorithm>
#include <string.h>
int n, k, vis[1000005][12], ans = -1;
void dfs(int deep, int val, int cur)
{
if (deep == cur) // 递归边界
{
ans = std::max(ans, val);
return ;
}
else
{
char fstr[12] = {0};
sprintf(fstr, "%d", val);
int Size = strlen(fstr);
for (int i = 0; i < Size; i++)
for (int j = i + 1; j < Size; j++)
{
char tstr[12] = {0};
strcpy(tstr, fstr);
std::swap(tstr[i], tstr[j]);
if (tstr[0] == '0') continue;
int p = atoi(tstr);
if (!vis[p][cur])
{
vis[p][cur] = 1;
dfs(deep, p, cur + 1);
}
}
}
}
int main()
{
scanf("%d%d", &n, &k);
dfs(k, n, 0);
printf("%d", ans);
return 0;
}