nyoj 999: 点击打开题目链接

题目思路,处理一下地图,把 D E 能看到的地方标记一下。然后就是暴力广搜一下。标记状态,因为同样在同一个点,但是你刚出发到达那点和找到D之后到达相同的点和找到E之后到达相同的点,这3中状态是不同的。用vis[x][y][3]

来标记状态,标记状态知道这题就AC了。

还有另外的思路就是把它们一个一个搜,S-->D-->E     S-->D-->E   S-->D,E;   分别广搜,取min即可。

下面是第一种,标记状态的方法。另外一种就不写了。

#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<vector>
#include<string>
#include<string.h>
#include<queue> using namespace std;
typedef long long int LL;
typedef short int sint;
const int INF=~(1<<31);
const int MM=105; int n,m,times;
sint dir[4][2]= {{1,0},{0,1},{-1,0},{0,-1}};
char maps[MM][MM];
bool vis[MM][MM][3];
struct node
{
short int x,y,step,now;
};
bool is_out(sint x,sint y)
{
if(x>=0&&x<n&&y>=0&&y<m) return true;
return false;
}
int bfs(int sx,int sy)
{
node first,second;
if(maps[sx][sy]=='e') first.now=2;
else if(maps[sx][sy]=='d') first.now=1;
else if(maps[sx][sy]=='f') first.now=3;
else first.now=0;
queue<node>q;
first.step=0,first.x=(sint)sx,first.y=(sint)sy;
q.push(first);
while(!q.empty())
{
first=q.front();
q.pop();
// printf("step=%d x=%d y=%d now=%d\n",(int)first.step,first.x,first.y,first.now);
if(first.now==3) return first.step;
if(first.step>times) return -1;
for(int i=0; i<4; i++)
{
sint x=first.x+dir[i][0],y=first.y+dir[i][1];
if(is_out(x,y)&&vis[x][y][first.now]==0&&maps[x][y]!='X')
{
int now=first.now;
second.now=now;
vis[x][y][first.now]=true;
if(maps[x][y]=='f') second.now=3;
if(maps[x][y]=='d'&&now==2) second.now=3;
else if(maps[x][y]=='d') second.now=1;
if(maps[x][y]=='e'&&now==1) second.now=3;
else if(maps[x][y]=='e') second.now=2;
if(second.now!=3) vis[x][y][second.now]=true;
second.step=first.step+1,second.x=x,second.y=y;
q.push(second);
}
}
}
return -1;
}
void set_map(int dx,int dy,int ex,int ey)
{
int x,y;
for(x=dx+1,y=dy; is_out(x,y)&&maps[x][y]=='.'; x++) maps[x][y]='d';
for(x=dx-1,y=dy; is_out(x,y)&&maps[x][y]=='.'; x--) maps[x][y]='d';
for(x=dx,y=dy+1; is_out(x,y)&&maps[x][y]=='.'; y++) maps[x][y]='d';
for(x=dx,y=dy-1; is_out(x,y)&&maps[x][y]=='.'; y--) maps[x][y]='d'; for(x=ex+1,y=ey; is_out(x,y)&&(maps[x][y]=='.'||maps[x][y]=='d'); x++)
if(maps[x][y]=='d') maps[x][y]='f';
else maps[x][y]='e';
for(x=ex-1,y=ey; is_out(x,y)&&(maps[x][y]=='.'||maps[x][y]=='d'); x--)
if(maps[x][y]=='d') maps[x][y]='f';
else maps[x][y]='e';
for(x=ex,y=ey+1; is_out(x,y)&&(maps[x][y]=='.'||maps[x][y]=='d'); y++)
if(maps[x][y]=='d') maps[x][y]='f';
else maps[x][y]='e';
for(x=ex,y=ey-1; is_out(x,y)&&(maps[x][y]=='.'||maps[x][y]=='d'); y--)
if(maps[x][y]=='d') maps[x][y]='f';
else maps[x][y]='e';
}
void p_m()
{
int i,j;
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
printf("%c",maps[i][j]);
printf("\n");
}
}
int main(void)
{
int cases=0;
while(cin>>n>>m>>times)
{
int i,j,sx,sy,dx,dy,ex,ey;
memset(maps,0,sizeof(maps));
memset(vis,0,sizeof(vis));
for(i=0; i<n; i++)
{
cin>>maps[i];
for(j=0; j<m; j++)
{
if(maps[i][j]=='S') maps[i][j]='.',sx=i,sy=j;
if(maps[i][j]=='D') dx=i,dy=j;
if(maps[i][j]=='E') ex=i,ey=j;
}
}
set_map(dx,dy,ex,ey);
maps[dx][dy]='X';
maps[ex][ey]='X';
printf("Case %d:\n%d\n",++cases,bfs(sx,sy));
}
return 0;
}

nyoj 999的更多相关文章

  1. nyoj 999——师傅又被妖怪抓走了——————【双广搜】

    师傅又被妖怪抓走了 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 话说唐僧复得了孙行者,师徒们一心同体,共诣西方.自宝象国救了公主,承君臣送出城西,沿路饥餐渴饮,悟 ...

  2. nyoj 163 Phone List(动态字典树<trie>) poj Phone List (静态字典树<trie>)

    Phone List 时间限制:1000 ms  |  内存限制:65535 KB 难度:4   描述 Given a list of phone numbers, determine if it i ...

  3. NYOJ 1007

    在博客NYOJ 998 中已经写过计算欧拉函数的三种方法,这里不再赘述. 本题也是对欧拉函数的应用的考查,不过考查了另外一个数论基本定理:如何用欧拉函数求小于n且与n互质所有的正整数的和. 记eule ...

  4. NYOJ 998

    这道题是欧拉函数的使用,这里简要介绍下欧拉函数. 欧拉函数定义为:对于正整数n,欧拉函数是指不超过n且与n互质的正整数的个数. 欧拉函数的性质:1.设n = p1a1p2a2p3a3p4a4...pk ...

  5. Error Domain=NSURLErrorDomain Code=-999 “The operation couldn’t be completed.

    转:http://www.wangzhengdong.com/blog/error-domainnsurlerrordomain-code-999-the-operation-couldnt-be-c ...

  6. NYOJ 333

    http://www.cppblog.com/RyanWang/archive/2009/07/19/90512.aspx?opt=admin 欧拉函数 E(x)表示比x小的且与x互质的正整数的个数. ...

  7. NSURLErrorDomain -999 "Canceled" 错误探究

    完整错误描述为 Error Domain=NSURLErrorDomain Code=-999 "Canceled/已取消" 这个错误一般用来描述某个网络请求在还未被发出时就被意外 ...

  8. NYOJ 99单词拼接(有向图的欧拉(回)路)

    /* NYOJ 99单词拼接: 思路:欧拉回路或者欧拉路的搜索! 注意:是有向图的!不要当成无向图,否则在在搜索之前的判断中因为判断有无导致不必要的搜索,以致TLE! 有向图的欧拉路:abs(In[i ...

  9. 编写一个Java应用程序,该应用程序包括2个类:Print类和主类E。Print 类里有一个方法output()功能是输出100 ~ 999之间的所有水仙花数(各位数字的 立方和等于这个三位数本身,如: 371 = 33 + 73 + 13。)在主类E的main方法中来 测试类Print

    package zuoye; public class print { void output() { System.out.println("100-999之间的水仙花数是:") ...

随机推荐

  1. GIL锁、死锁、递归锁、定时器

    GIL (Global Interpreter Lock) 锁 '''定义:In CPython, the global interpreter lock, or GIL, is a mutex th ...

  2. 小程序-列表块/类式ul-li格式(1)

    摘要 目前列表能布局出来,但是目前我个人还没解决的问题是:如果每个列表块都有详情页怎么解决呢? 1:我的效果图 2.正常的每个都能点击的html 注:上面的代码确实能够实现我的每个[menu2_vie ...

  3. 实验十二 swing图形界面设计

    1.源程序 package information;import java.awt.Container;import java.awt.FlowLayout;import java.awt.event ...

  4. 【mac】mac上安装软件,报错 鉴定错误,但是安装包都是好的

    出现这个问题, 原因解析: 不是你的安装包下载出错了或者下载失败了这种原因 而是你在打开这个安装包的时候,一定是让你输入密码,而你的密码没有输入正确 解决方式:重新开始打开这个软件的安装包 如下: 1 ...

  5. Mysql导出导入相关操作记录

    一.使用source source sql脚本文件路径 二.使用mysqldump 命令行下具体用法如下:  mysqldump -u用户名 -p密码 -d 数据库名 表名 脚本名; 1.导出数据库為 ...

  6. 【Todo】C++类 & 通用面试题分析记录 & 最难的bug

    1. the most difficult bug u fixed and how u solved this problem.. 解决过很多疑难bug.最困难的分为两类.一类是并发.多线程类的,因为 ...

  7. 【paddle学习】词向量

    http://spaces.ac.cn/archives/4122/   关于词向量讲的很好 上边的形式表明,这是一个以2x6的one hot矩阵的为输入.中间层节点数为3的全连接神经网络层,但你看右 ...

  8. xgboost调参

    The overall parameters have been divided into 3 categories by XGBoost authors: General Parameters: G ...

  9. Youth is not a time of life, it is a state of mind.

    青春不是生命的一段,而是一种精神状态.

  10. 常用linux系统监控命令

    一.内存监控 监控内存的使用状态是非常重要的,通过监控有助于了解内存的使用状态,比如内存占用是否正常,内存是否紧缺等等,监控内存最常使用的命令有free.vmstat.top等 1.1 free $ ...