codevs 3344 迷宫
小刚在迷宫内,他需要从A点出发,按顺序经过B,C,D……,到达最后一个点,再回到A点。迷宫内有些障碍,问至少走几步。
第一行有三个数n,m表示迷宫有n行,m列。
第2行到第n+1行,每行m个字符,可能是’A’..’Z’,’2’,’0’ 其中,2表示障碍,0表示可以走。’A’..’Z’也可以走。
至少走几步可以按规定走完,如果不行,输出“Impossible”
5 5
A002B
022C0
000D0
00222
0000E
26
0%的数据满足:1<=n<=10 1<=m<=10 字母为“A”..“B”。
30%的数据满足:1<=n<=10 1<=m<=10 字母为“A”..“G”。
50%的数据满足:1<=n<=10 1<=m<=10 字母为“A”..“Z”。
10%的数据满足:1<=n<=100 1<=m<=100 字母为“A”..“B”。
30%的数据满足:1<=n<=100 1<=m<=100 字母为“A”..“G”。
100%的数据满足:1<=n<=100 1<=m<=100 字母为“A”..“Z”。
bfs
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio> using namespace std; struct node
{
int x,y;
char ch;
}zm[];
int fx[]={,-,,},fy[]={,,-,};
int h,tot,n,m,i,j;
bool vis[][];
char atlas[][];
bool cmp(node a,node b)
{
return int(a.ch)<int(b.ch);
}
int dfs(int sx,int sy,int ox,int oy)
{
int f[][],head=,tail=;
f[tail][]=sx;
f[tail][]=sy;
f[tail][]=;
vis[sx][sy]=;
do
{
head++;
int x=f[head][],y=f[head][];
for(int k=;k<;++k)
{
int lx=x+fx[k],ly=y+fy[k];
if(lx>=&&lx<n&&ly>=&&ly<m&&!vis[lx][ly]&&atlas[lx][ly]!='')
{
f[++tail][]=lx;
f[tail][]=ly;
f[tail][]=f[head][]+;
vis[lx][ly]=;
if(lx==ox&&ly==oy)
return f[head][];
}
}
}while(head<=tail);
return ;
}
int main()
{
scanf("%d%d",&n,&m);
for(i=;i<n;++i)
{
for(j=;j<m;++j)
{
cin>>atlas[i][j];
if(atlas[i][j]>='A'&&atlas[i][j]<='Z')
{
zm[tot].x=i;
zm[tot].y=j;
zm[tot].ch=atlas[i][j];
tot++;
}
}
}
sort(zm,zm+tot,cmp);
for(i=;i<tot;++i)
{
if(i<tot-)
{
memset(vis,,sizeof(vis));
int k=dfs(zm[i].x,zm[i].y,zm[i+].x,zm[i+].y);
if(k)
h+=k;
else
{
printf("Impossible");
return ;
}
}
else
{
memset(vis,,sizeof(vis));
int k=dfs(zm[i].x,zm[i].y,zm[].x,zm[].y);
if(k)
h+=k;
else
{
printf("Impossible");
return ;
}
}
}
printf("%d",h);
return ;
}
codevs 3344 迷宫的更多相关文章
- codevs——3344 迷宫
3344 迷宫 时间限制: 1 s 空间限制: 32000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description 小刚在迷宫内,他需要从A点出发,按顺序经过B, ...
- codevs 1215 迷宫
时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 已知 n 个整数 x1,x2,-,xn,以及一个整数 k(k<n).从 n ...
- BFS简单题套路_Codevs 1215 迷宫
BFS 简单题套路 1. 遇到迷宫之类的简单题,有什么行走方向的,先写下面的 声明 ; struct Status { int r, c; Status(, ) : r(r), c(c) {} // ...
- Codevs 1337 银行里的迷宫
1337 银行里的迷宫 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 白银 Silver 传送门 题目描述 Description 楚楚每一次都在你的帮助下过了一关又一关(比如他开 ...
- Codevs 2855 游乐园的迷宫
2855 游乐园的迷宫 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 迷宫可是每个游乐园必不可少的项目,菜菜当然是要尝试一下啦. ...
- codevs——T1337 银行里的迷宫
时间限制: 1 s 空间限制: 128000 KB 题目等级 : 白银 Silver 题解 题目描述 Description 楚楚每一次都在你的帮助下过了一关又一关(比如他开宴会). ...
- Codevs 1629 01迷宫
1629 01迷宫 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题目描述 Description 有一个由01组成的n*n格迷宫,若你位于一格0上,那么你可 ...
- 习题:codevs 2822 爱在心中 解题报告
这次的解题报告是有关tarjan算法的一道思维量比较大的题目(真的是原创文章,希望管理员不要再把文章移出首页). 这道题蒟蒻以前做过,但是今天由于要复习tarjan算法,于是就看到codevs分类强联 ...
- codevs 2822 爱在心中
codevs 2822 爱在心中 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description “每个人都拥有一个梦,即使彼此不相同, ...
随机推荐
- Jquery获取web窗体关闭事件,排除刷新页面
在js脚本里全局定义一个 var r=true;若是刷新的话则把r=false; $(window).unload(function () { if (r) { //这里面证明用户不是点的F5刷新 执 ...
- 文本编辑器[notepad++] :一些快捷键
资源来自网络收集. Ctrl+C 复制 Ctrl+X 剪切 Ctrl+V 粘贴 Ctrl+Z 撤消 Ctrl+Y 恢复 Ctrl+A 全选 Ctrl+F 键查找对话框启动 Ctrl+H 查找/替换对话 ...
- ViewerJS 一个在浏览器上查看 PDF 和电子表格的 JavaScript 库
Viewer.js简介 http://viewerjs.org/ 下载Viewer.js压缩包,解压后将ViewerJS文件夹放在网站根目录下 在浏览器地址栏中输入网址http://172.16.8. ...
- hibernate Criteria中or和and的用法
/s筛选去除无效数据 /* detachedCriteria.add( Restrictions.or( Restrictions.like("chanpin", &qu ...
- CF-832B
B. Petya and Exam time limit per test 2 seconds memory limit per test 256 megabytes input standard i ...
- codevs-1204
1204 寻找子串位置 题目描述 Description 给出字符串a和字符串b,保证b是a的一个子串,请你输出b在a中第一次出现的位置. 输入描述 Input Description 仅一行包含两个 ...
- sfc命令
开始—>运行—>再输入“sfc /scannow”(不含引号),“sfc”是“系统文件检测”程序,它是一个在命令提示符下使用的实用程序,只有是管理员才能使用该程序,这个程序的作用就是检测系 ...
- F#周报2019年第20期
新闻 2019年理事会活动 "实用的F#挑战"意见截止日期接近,不要忘记提交博客文章或者其它作品 接口中的默认实现 .NET Core 3.0里的性能增强 使用Try .NET创建 ...
- 小奇的仓库(树形DP)
「题目背景」 小奇采的矿实在太多了,它准备在喵星系建个矿石仓库.令它无语的是,喵星系的货运飞船引擎还停留在上元时代! 「问题描述」 喵星系有n个星球,星球以及星球间的航线形成一棵树. 从星球a到星球b ...
- [題解]luogu_P1144最短路計數
1.無權圖最短路邊權為1 2.如果兩個點恰好不能被更新(d[y]==d[x]+1)那麼就能通過x的所有最短路到達y,所以ans[y]+=ans[x] 3.如果兩個點不能恰好被更新(d[y]>d[ ...