题目链接:https://vijos.org/p/1406

题目描述

迢迢牵牛星,皎皎河汉女。
纤纤擢素手,札札弄机杼;
终日不成章,泣涕零如雨。
河汉清且浅,相去复几许?
盈盈一水间,脉脉不得语。
——《古诗十九首》
传说,上古时期的某个七月七日,王母娘娘为了阻止牛郎织女的爱情,划一道玉钗拆散鸳鸯,使两人“星桥鹊驾,经年才见,想离情、别恨难穷。”于是,“执子之手,与子偕老”成了天下有情人共同的希翼。
在气宇轩昂、玉树临风、才高八斗、英俊潇洒的程文大牛的期盼中,浪漫又迷人的七夕终于来临了。迷离的夜空之上,牛郎织女的絮语伴随着美好的秋光,浸润了古今文人墨客多情的心。他与美若天仙、唇红齿白、蕙质兰心、冰雪聪明的某MM约好在清江的小桥上相会……
天亦有情,此时,浮云错开,从天而降一张丝绸地图:正面上,不同颜色的星星组成了前方道路的俯视图;背面写着“愿有情人终成眷属,无伴者皆得幸福。——瑾姝”。
程文仔细看着这个图,发现自己必须从上到下打通一条道路才能见到某MM,于是程文决定用排云掌和风神腿打开前方的道路——
现用不同的字母来表示不同颜色的星星,连在一起(水平或竖直相邻才算连在一起)的相同颜色的星星,程文可以一次性全部打掉。图样如下:
AABBCCD
AFFBGGD
IIJBKKD
MNNOOPD
QQRRSST
比如在这张地图中,程文可以先打掉最右边的D区域,然后再打通T区域,这样就只用两次就可以打通道路(道路是可以拐弯的,不一定要是一条直线)。
因为使用排云掌和风神腿会耗费体力,耗费干净了程文就没法陪MM一起玩了,所以程文想用最少的次数来打通这条道路,不过程文现在跑去学Java了,这件事就交给你了。

输入格式

第一行有两个整数,m和n(0<m,n<21);
下面m行,每行n个字母。

输出格式

一个整数,程文打通道路用功力的最少的次数。

样例输入

5 7
AABBCCD
AFFBGGD
IIJBKKD
MNNOOPD
QQRRSST

样例输出

2

解题思路

这道题可以用最短路做,也可以搜索。最短路的话主要就是建图的问题,最短路哪个都行,Dijkstra、Floyd、SPFA...不过还是感觉DFS比较简单一些,数据也并不是很大。
Dijkstra:

#include <stdio.h>
#define MAXN 25
const int inf = 99999999;
char a[MAXN][MAXN];
int n, m, vis[MAXN * MAXN], dis[MAXN * MAXN], map[MAXN * MAXN][MAXN * MAXN];
void Dijkstra(int s)
{int k, minn;for (int i = 0; i < n * m; i++){vis[i] = 0;dis[i] = inf;}dis[s] = 0;for (int i = 0; i < n * m; i++){k = s;minn = inf;for (int j = 0; j < n * m; j++)if (!vis[j] && minn > dis[j])minn = dis[k = j];vis[k] = 1;for (int j = 0; j < n * m; j++)if (map[k][j] < inf)if (!vis[j] && dis[j] > dis[k] + map[k][j])dis[j] = dis[k] + map[k][j];}
}
int main()
{int minn;while (~scanf("%d%d", &n, &m)){minn = inf;for (int i = 0; i < n * m; i++)for (int j = 0; j < n * m; j++)map[i][j] = inf;for (int i = 0; i < n; i++){for (int j = 0; j < m; j++){scanf(" %c", &a[i][j]);if (i){if (a[i - 1][j] != a[i][j])map[(i - 1) * m + j][i * m + j] = map[i * m + j][(i - 1) * m + j] = 1;else map[(i - 1) * m + j][i * m + j] = map[i * m + j][(i - 1) * m + j] = 0;}if (j){if (a[i][j - 1] != a[i][j])map[i * m + j - 1][i * m + j] = map[i * m + j][i * m + j - 1] = 1;else map[i * m + j - 1][i * m + j] = map[i * m + j][i * m + j - 1] = 0;}}}for (int i = 0; i < m; i++){Dijkstra(i);for (int j = (n - 1) * m; j < n * m; j++)if (minn > dis[j])minn = dis[j];}printf("%d\n", minn + 1);}return 0;
}

DFS:

#include <stdio.h>
char a[25][25];
int n, m, map[25][25];
const int inf = 0x7fffffff;
int dir[4][2] = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};
void DFS(int x, int y, int step)
{int tx, ty, s;if (map[x][y] <= step)return;map[x][y] = step;for (int i = 0; i < 4; i++){tx = x + dir[i][0];ty = y + dir[i][1];if (tx >= 0 && tx < n && ty >= 0 && ty < m){if (a[tx][ty] != a[x][y])s = step + 1;else s = step;DFS(tx, ty, s);}}
}
int main()
{int minn;while (~scanf("%d %d", &n, &m)){minn = inf;for (int i = 0; i < n; i++)for (int j = 0; j < m; j++)map[i][j] = inf;for (int i = 0; i < n; i++)scanf("%s", a[i]);for (int i = 0; i < m; i++)DFS(0, i, 1);for (int i = 0; i < m; i++)if (minn > map[n - 1][i])minn = map[n - 1][i];printf("%d\n", minn);}return 0;
}

Vijos - 古韵之鹊桥相会(最短路||DFS)相关推荐

  1. TOJ 2921 古韵之鹊桥相会 / 深搜

    古韵之鹊桥相会 时间限制(普通/Java):1000MS/3000MS     运行内存限制:65536KByte 描述 迢迢牵牛星,皎皎河汉女. 纤纤擢素手,札札弄机杼: 终日不成章,泣涕零如雨. ...

  2. 【noip模拟赛1】古韵之鹊桥相会(最短路)

    描述 迢迢牵牛星,皎皎河汉女. 纤纤擢素手,札札弄机杼: 终日不成章,泣涕零如雨. 河汉清且浅,相去复几许? 盈盈一水间,脉脉不得语. --<古诗十九首> 传说,上古时期的某个七月七日,王 ...

  3. Vijos - 观光旅游(Floyd最短路)

    题目链接:https://vijos.org/p/1046 题目描述 学校里面有N个景点.两个景点之间可能直接有道路相连,用Dist[I,J]表示它的长度:否则它们之间没有直接的道路相连.这里所说的道 ...

  4. Vijos - 文化之旅(最短路)

    题目链接:https://vijos.org/p/1794 题目描述 有一位使者要游历各国,他每到一个国家,都能学到一种文化,但他不愿意学习任何一种文化超过一次,即如果他学习了某种文化,则他就不能到达 ...

  5. 【vijos】【spfa最短路】想越狱的小杉

    描述 小杉看了看自己的纹身,明白了整个管道网是由N个小房间和若干小房间之间的单向的管道组成的. 小房间编号为不超过N的正整数. 对于某个管道,小杉只能在人品不超过一定程度时通过. 小杉一开始在房间1, ...

  6. 【图论专题】单源最短路的综合应用

    单源最短路径经常与DFS.DP.二分.拓扑排序等算法的结合使用. 题目列表: 题目 算法 AcWing 1135. 新年好 最短路+DFS AcWing 340. 通信线路 二分+双端队列BFS Ac ...

  7. 搜索(DFS与BFS)

    搜索 BFS Flood Fill模型 池塘计数 城堡问题 山峰和山谷 最短路模型 迷宫问题 武士风度的牛 抓住那头牛 多源BFS 矩阵距离 最小步数模型 魔板 双端队列广搜 电路维修 双向广搜 字串 ...

  8. 【HDOJ图论题集】【转】

    1 =============================以下是最小生成树+并查集====================================== 2 [HDU] 3 1213 How ...

  9. 一系列图论问题[转]

    =============================以下是最小生成树+并查集====================================== [HDU] 1213 How Many ...

最新文章

  1. CSS3 Transitions 你可能不知道的知识点
  2. 魅族大数据之流平台设计部署实践--转
  3. 你所需要的java网络编程大总结
  4. 【caffe-Windows】mnist实例编译之model的生成
  5. Newtonsoft.Json反序列化(Deserialize)出错:Bad JSON escape sequence
  6. java高级工程师 考试_JAVA高级工程师笔试题及答案
  7. Java程序设计教程(第三版) 雍俊海 9.6 答案/代码
  8. Ambari安装和汉化(转)
  9. 华为智慧屏鸿蒙os的特点,华为智慧屏功能特点一览
  10. npm ERR path /Users/user/Desktop/app/node_modules/node-sass
  11. 阿里云香港服务器购买教程(图文)
  12. 2017滴滴校招编程
  13. calcite parser
  14. 美团因拖欠骑手工资被约谈;传苹果6月6日举办全球开发者大会;Linux 5.18开始启动停止支持ReiserFS|极客头条
  15. NFC开发 —————实用工具以及开发文档(四)
  16. php 合并多个excel,excel中如何将多个sheet合并成一个
  17. 路就在脚下,请勇敢的迈步。-----(对未来职业期望)
  18. php 全文搜索引擎-讯搜使用
  19. MQ系列传感器电路图
  20. opencv---c++(2)

热门文章

  1. oracle调优总结 本文转自:http://blog.csdn.net/wonth/article/details/1670366
  2. 批量合并word文档
  3. 内存条 udimm rdimm 等和 ECC 功能
  4. 上篇日本人经营之道 一制造轰动效应出奇制胜
  5. “跨次元”检测模型hold住各种画风,真人赛博,在线Demo可玩
  6. 购买的Microsoft Office不小心卸载后重新安装方法
  7. Microsoft Edge浏览器不兼容解决办法
  8. Ecma 118th GA会议手记
  9. 单源最短路径bellman算法
  10. 23种设计模式之代理模式(动态代理)