原题链接

题意

给两个等长的只含数字1,2,3,4,5,6的字符串s(|s|≤110),有两种操作:

- 把一个位置的数字换成另一个数字,换成的数字也只能是1到6
- 把这个字符串中相同的数字都换成另一种数字
应用上面的两种操作把第二个字符串转换成第一个字符串至少需要多少次操作?

分析
首先尽可能多的进行第二次操作一定是最优的。
对于第二种操作,我们可以预处理出来变换到每个状态的最短步数,也就是用bfs跑。以123456标记为初始状态state,然后每次选择一个要变换的数字以及变换成的数字。
那么,如何求解从第二个字符串变到第一个字符串的最少步数呢?根据上面的状态定义,初始状态为123456(位置1对应数字1,位置2对应数字2....),那么每到一个新的状态nxt,先用数组存起来对应位置的change[],遍历s2,如果change[s2[j]]!=s1[j](change[s2[j]]表示s2[j]在nxt状态下变成了change[s2[j]]),则需要进行操作1,tmp++。
那么遍历所有状态,ans=min(ans,tmp+step[nxt])

#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <math.h>
#include <queue>
using namespace std;
const int MAX_N = ;
int total = , step[MAX_N], res[MAX_N], pw10[];
queue<int> que;
char s1[], s2[];
void bfs() {
pw10[] = ;
for (int i = ; i <= ; ++i) { pw10[i] = * pw10[i - ]; }
memset(step, -, sizeof (step));
int st = ;
step[st] = total, res[total++] = st;
que.push(st);
while (!que.empty()) {
int cur = que.front();
que.pop();
for (int i = ; i <= ; ++i) {
for (int j = ; j <= ; ++j) {
if (i == j) continue;
int nxt = ;
for (int k = ; k >= ; --k) {
int p = cur / pw10[k] % ;
if (p == i) nxt = nxt * + j;
else nxt = nxt * + p;
}
if (step[nxt] != -) continue;
step[nxt] = step[cur] + ;
res[total++] = nxt;
que.push(nxt);
}
}
}
}
int main() {
bfs();
while (~scanf("%s%s", s1, s2)) {
int len = strlen(s1);
int ans = len, change[];
for (int i = ; i < total; ++i) {
int cur = res[i], tmp = ;
for (int j = , k = ; j >= ; --j) {
change[k++] = cur / pw10[j] % ;
}
for (int j = ; j < len; ++j) {
int to = change[s2[j] - ''];
if (to != s1[j] - '') tmp++;
}
ans = min(ans, tmp + step[cur]);
}
printf("%d\n", ans);
}
return ;
}

UVALive - 7263 Today Is a Rainy Day(bfs)的更多相关文章

  1. LA 7263 Today Is a Rainy Day bfs+暴力 银牌题

    7263 Today Is a Rainy Day Today is a rainy day. The temperature is apparently lower than yesterday. ...

  2. What a Ridiculous Election UVALive - 7672 (BFS)

    题目链接: E - What a Ridiculous Election  UVALive - 7672 题目大意: 12345 可以经过若干次操作转换为其它五位数. 操作分三种,分别为: 操作1:交 ...

  3. UVALive 5066 Fire Drill BFS+背包

    H - Fire Drill Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit Sta ...

  4. UVALive 4025 Color Squares(BFS)

    题目链接:UVALive 4025 Color Squares 按题意要求放带有颜色的块,求达到w分的最少步数. //yy:哇,看别人存下整个棋盘的状态来做,我什么都不想说了,不知道下午自己写了些什么 ...

  5. UVALive 5066 Fire Drill --BFS+DP

    题意:有一个三维的地图,有n个人被困住,现在消防队员只能从1楼的一个入口进入,营救被困者,每一个被困者有一个价值,当消防队员找到一个被困者之后,他可以营救或者见死不救,如果救的话,他必须马上将其背到入 ...

  6. UVALive 6665 Dragon’s Cruller --BFS,类八数码问题

    题意大概就是八数码问题,只不过把空格的移动方式改变了:空格能够向前或向后移动一格或三格(循环的). 分析:其实跟八数码问题差不多,用康托展开记录状态,bfs即可. 代码: #include <i ...

  7. UVALive 7297 bfs

    题意 一个小偷偷到了项链 他想知道自己是否可以逃出去 地图中有一个小偷 一个警察 警察有一条狗 一开始 小偷和警察的移动速度都是1 当警察走到小偷经过过的地方时 警察会有一条狗嗅到小偷的气味并且以2的 ...

  8. UVALive 7297 Hounded by Indecision BFS

    题目链接:Hounded by Indecision 题意:map中给出小偷的位置,警察的位置.警察有一只狗,开始的时候警察和狗一起行动,也就是看做一个格子,当警察遇见小偷走过的格子时,狗就会嗅到它的 ...

  9. UVALive 3956 Key Task (bfs+状态压缩)

    Key Task 题目链接: http://acm.hust.edu.cn/vjudge/contest/129733#problem/D Description The Czech Technica ...

随机推荐

  1. Activiti解析.bpmn文件获得User Task节点的CandidateUsers特性的值

    参考文档: http://www.cnblogs.com/mingforyou/p/5351332.html http://blog.csdn.net/jackyrongvip/article/det ...

  2. Trouble shooting(问题解决):centos 7 gnome show someting has gone wrong.

    centos 7 升级 内核 3.10,startx启动不了了.进界面也是oh,no!someting has gone wrong . 参见帖子:http://bbs.csdn.net/topics ...

  3. 【Java集合的详细研究4】Java中如何遍历Map对象的4种方法

    方法一 通过Map.entrySet遍历key和value,在for-each循环中使用entries来遍历.推荐,尤其是容量大时 这是最常见的并且在大多数情况下也是最可取的遍历方式.在键值都需要时使 ...

  4. SpringBoot(十五)_springboot实现预览pdf

    最近,项目上要做个打印的东西,还要预览.我想就直接生成pdf预览,然后用户选择打印 于是,昨天找了找资料.一般用itext 进行转pdf.于是我就用springboot试了试,代码比较简单,现在只是简 ...

  5. Go语言之unsafe包介绍及使用

    unsafe内容介绍 type ArbitraryType int type Pointer *ArbitraryType func Sizeof(x ArbitraryType) uintptr f ...

  6. BZOJ2716 [Violet]天使玩偶(cdq分治+树状数组)

    非常裸的KD-tree.然而我没学啊. 考虑如何离线求一个点在平面中的曼哈顿最近点. 绝对值显得有点麻烦,于是把绝对值拆开分情况讨论一波.对于横坐标小于该点的,记录对于纵坐标的前缀x+y最大值和后缀x ...

  7. 【刷题】LOJ 2863 「IOI2018」组合动作

    题目描述 你在玩一个动作游戏.游戏控制器有 \(4\) 个按键,A.B.X 和 Y.在游戏中,你用组合动作来赚金币.你可以依次按这些按键来完成一个组合动作. 这个游戏有一个隐藏的按键序列,可以表示为由 ...

  8. 自学Linux Shell10.1-使用编辑器vim

    点击返回 自学Linux命令行与Shell脚本之路 10.1-使用编辑器vim 所有的 Unix系统都会内建 vi 文书编辑器,其他的文书编辑器则不一定会存在.但是目前我们使用比较多的是 vim 编辑 ...

  9. 洛谷 P2515 [HAOI2010]软件安装 解题报告

    P2515 [HAOI2010]软件安装 题目描述 现在我们的手头有\(N\)个软件,对于一个软件\(i\),它要占用\(W_i\)的磁盘空间,它的价值为\(V_i\).我们希望从中选择一些软件安装到 ...

  10. 更新本地git仓库的远程地址(remote地址)

    如果远程仓库的地址更新了,我们本地仓库就需要更新remote地址, 可以通过git remote -v或者cat .git/config查看通信方式及远程地址 更新远程地址的方式有两种: 第一种方式: ...