首页 技术 正文
技术 2022年11月14日
0 收藏 466 点赞 4,191 浏览 2801 个字

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;
}
相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,492
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,907
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,740
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,495
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:8,133
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:5,297