此题非常经典,确实学习到了很多的东西;

路径搜索这种类型的题目步骤是这样的:

第一保存状态

第二寻找状态之间的关系,即一个状态能够走向哪些状态

第三判断这个新产生的状态是否已经走过。

scanf("%d%d%d\n");后面加\N,下次读的时候就可以换行读,和fgets配合起来很好用

如果开数组可以把所有的状态都包含进来的话,那么就可以去开数组

学到的东西,只需要保存各个可以走的cell就可以了

这道题目还需要以后再细细品味一下

下面是AC代码:

#include<cstdio>
#include<vector>
#include<queue>
#include<cstring>
using namespace std;const int maxn = 150;//状态个数的估计是非常重要的
struct state
{int fir,sec,thir;state(int a = 0,int b = 0,int c = 0):fir(a),sec(b),thir(c){}
};int dist[maxn][maxn][maxn];
int start[3];
int End[3];
char G[20][20];
vector<int>Next[150];
int cnt = 0;
int dr[] = {-1,0,1,0};
int dc[] = {0,1,0,-1};
bool read_input()
{cnt = 0;memset(dist,0,sizeof(dist));//start.clear();//End.clear();for(int i = 0;i < 150;i++){Next[i].clear();}int row,col,num_ghost;scanf("%d%d%d\n",&col,&row,&num_ghost);if(!row){return false;}//cnt代表此时用多少个可以走的cellfor(int i = 0;i < row;i++){fgets(G[i],20,stdin);for(int j = 0;j < col;j++){if(G[i][j] != '#'){if(G[i][j] <= 'Z' && G[i][j] >= 'A'){End[G[i][j] - 'A'] = cnt;//End.push_back(cnt);
                }else if(G[i][j] <= 'z' && G[i][j] >= 'a'){start[G[i][j] - 'a'] = cnt;}G[i][j] = cnt;cnt++;}}}for(int r = 0;r < row;r++){for(int c = 0;c < col;c++){if(G[r][c] != '#'){Next[G[r][c]].push_back(G[r][c]);for(int k = 0;k < 4;k++){if(G[r + dr[k]][c + dc[k]] != '#'){Next[G[r][c]].push_back(G[r + dr[k]][c + dc[k]]);}}}}}if(num_ghost == 1){Next[cnt + 1].push_back(cnt + 1);Next[cnt + 2].push_back(cnt + 2);start[1] = cnt + 1;start[2] = cnt + 2;End[1] = cnt + 1;End[2] = cnt + 2;//start.push_back(cnt + 1);//start.push_back(cnt + 2);
    }else if(num_ghost == 2){Next[cnt + 1].push_back(cnt + 1);start[2] = cnt + 1;End[2] = cnt + 1;//start.push_back(cnt + 1);
    }return 1;
}void BFS()
{memset(dist,-1,sizeof(dist));queue<state>Q;state u(start[0],start[1],start[2]);Q.push(u);dist[start[0]][start[1]][start[2]] = 0;while(!Q.empty()){state u = Q.front();Q.pop();if(u.fir == End[0] && u.sec ==End[1] && u.thir == End[2]){printf("%d\n",dist[End[0]][End[1]][End[2]]);return ;//找到了答案
        }int fir1 ,sec1,thir1;for(int i = 0;i < Next[u.fir].size();i++){fir1 = Next[u.fir][i];for(int j = 0; j < Next[u.sec].size();j++){sec1 = Next[u.sec][j];if(fir1 == sec1 || (u.fir == sec1 && u.sec == fir1))continue;for(int k = 0;k < Next[u.thir].size();k++){thir1 = Next[u.thir][k];if(fir1 == thir1 || (u.fir == thir1 && u.thir == fir1))continue;if(sec1 == thir1 || (u.thir == sec1 && u.sec == thir1))continue;state v(fir1,sec1,thir1);if(dist[fir1][sec1][thir1] < 0 ){dist[fir1][sec1][thir1] = dist[u.fir][u.sec][u.thir] + 1;Q.push(v);}}}}}}int main()
{freopen("input.txt","r",stdin);freopen("output.txt","w",stdout);while(read_input()){BFS();}return 0;
}

转载于:https://www.cnblogs.com/TorettoRui/p/10495611.html

UVA1601万圣节的早上相关推荐

  1. #1081 : 最短路径·一(Dijkstra)

    #1081 : 最短路径·一 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 万圣节的早上,小Hi和小Ho在经历了一个小时的争论后,终于决定了如何度过这样有意义的一天-- ...

  2. hihocoder1081

    #1081 : 最短路径·一 时间限制: 10000ms 单点时限: 1000ms 内存限制: 256MB 描述 万圣节的早上,小Hi和小Ho在经历了一个小时的争论后,终于决定了如何度过这样有意义的一 ...

  3. 2016/10/31 宝贝儿蛋,万圣节快乐。

    万圣节快乐,老公公. 今天的你,开心吗 有想我吗 马上是新的一个月,没有我陪在你身边 你要开开心心快快乐乐的别让我牵挂你 照顾好自己,多喝水,我担心你身体 怕你流鼻血,怕你牙龈出血,怕你早上起晚 没有 ...

  4. 另类万圣节:十三种令程序员们夜不能寐的恐怖噩梦

    21套精品Java架构师高并发高性能高可用分布式集群电商缓存性能调优设计项目教程 39阶段精品云计算大数据项目实战视频教程 互联网技术(java框架.分布式.集群)干货视频大全 200本经典编程相关书 ...

  5. 这是我见过最骚的万圣节作妖大赛

    西雅图IT圈:seattleit [今日作者]栗头蓝 一个充满着人文情怀的 web前端相声演员 又到了组里一年一度的万圣节作妖大赛. IT人都是多才多艺的. 平时脱了裤子写代码,今天穿上衣服就变妖魔. ...

  6. 如何在“动物杂交:新视野”中为万圣节做准备

    Nintendo 任天堂 Can you feel the spooky chill in the air? Do you sense a distinct lack of pumpkin in yo ...

  7. ACNO.15猴子吃桃问题。猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。 第二天早上又将剩下的桃子吃掉一半,又多吃一个。以后每天早上都吃了前一天剩下的一半零一个。 到第N天早上想再

    题目描述 猴子吃桃问题.猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个.第二天早上又将剩下的桃子吃掉一半,又多吃一个.以后每天早上都吃了前一天剩下的一半零一个.到第N天早上想再吃时,见 ...

  8. 学生每日计划表_早上6:13,很多教室的灯就亮了!高考还有10天,你都想象不到这些学生有多拼...

    这两天,一位老师在朋友圈晒了一张照片,惊到了很多人. 这张照片发出的时间是早上6:13,天还没有亮,一幢黑漆漆的三层教学楼,十来间教室却已亮起灯来."无霜,不冷.高三学生已经开始苦读.&qu ...

  9. 早上醒来收获一个Surprise,成为CSDN博客专家了

    目录 起步 今天一早醒来打开手机,像往常一样,看一下CSDN app,突然有点小惊喜,因为头像上多了博客专家的图标了.我觉得CSDN这个操作(早上公布通过审核的消息)应该得到点赞的,因为可以让你早上醒 ...

最新文章

  1. 唐杰:AI 未来靠迭代
  2. 时间到,考试结束。请同学们交卷......
  3. CSS3笔记之基础篇(一)边框
  4. python3.7.2安装pywifi_python pywifi
  5. 天然气压缩因子计算软件_徐秀芬等:天然气加气站压缩机组效率的计算方法
  6. ORA-12505,TNS:listener does not currently know of SID given in connect descriptor(不知道的SID)
  7. 实例:供应商管理报表需求调研报告
  8. 使用grafana4的alert功能
  9. pycharm导入opencv库失败解决方法
  10. WEB前端性能优化及应用服务器性能优化和存储性能优化
  11. 10种软件滤波方法的示例程序(匠人转载学习)
  12. Win10 Word背景默认是绿色的怎么取消?
  13. 64位java没有javaw.exe,2019-01-01 eclipse无法找到javaw.exe怎么处理
  14. 【安装版】mysql数据库安装指南(超级详细)
  15. N70常用软件大集合
  16. vs2017安装勾选哪些_vs2017安装以编写c语言
  17. 【NOIP2006】【Luogu1063】能量项链
  18. JQuery 解决多个文件下载只下载一个的问题
  19. Python实例29:利用python自动创建多个Excel表格
  20. 如何成为技术大牛(华为超级技术大牛的十年经验总结)

热门文章

  1. 阿里云助力合作伙伴帮助政府、企业体验云计算大数据魅力!
  2. POJ 3687 Labeling Balls(拓扑序列)
  3. jconsole jvisualvm远程监视websphere服务器JVM的配置案
  4. 推荐的 CSS 书写顺序
  5. 何谓程序员?何谓中国的程序员?
  6. CListCtrl使用条款
  7. js在上传图片前判断大小
  8. #ifndef 与 #program once 的区别
  9. MySQL 使用自增ID主键和UUID 作为主键的优劣比較具体过程(从百万到千万表记录測试)...
  10. jvm类加载、初始化