计蒜客习题:逃跑

一位博主写了ac代码,但是无论是广度bfs还是深度dfs,都会报错,dfs是运行超时,bfs是答案错误。传送门:http://idealwill.com/2018/02/24/bfs-flee/

另一位博主使用了dfs代码,有兴趣可以看下,没有检验是否正确,传送门:https://blog.csdn.net/Liukairui/article/details/79407437

根据前位博主的bfs代码,做了几项修改,然后用自己的代码找错前位博主,发现找不出来,有兴趣的小伙伴可以试下,找一下前位博主的错误。当然虽然ac了,但是自己打的代码,稍有不懂,如果能够说出这里这样写代码的原理,也是十分感谢的。

ac代码:

#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
using namespace std;
const int M=110;
int n,m,k,d,ans=0;
int t,v,x,y;
char dirx;
int dir[5][2]={0,1,1,0,0,-1,-1,0,0,0};
bool vis[1000][M][M];
char soldier[M][M];
bool in(int x,int y)
{
	return 0<=x&&x<=n&&0<=y&&y<=m; 
}
struct node{
	int t,x,y;
	node(int _t,int _x,int _y):
	t(_t),x(_x),y(_y){}
};
void bfs()
{
	queue<node> q;
	q.push(node(0,0,0));
	vis[0][0][0]=true;
	while(!q.empty())
	{
		int t=q.front().t;
		int x=q.front().x;
		int y=q.front().y;
		q.pop();
		if(t>=d+1)continue;
		if(x==n&&y==m)
		{
			ans=t;
			return;
		}
		for(int i=0;i<5;i++)
		{
			int tx=x+dir[i][0];
			int ty=y+dir[i][1];	
		
			if(in(tx,ty)&&!vis[t+1][tx][ty]&&soldier[tx][ty] =='.')
			{
				vis[t+1][tx][ty]=true;
				q.push(node(t+1,tx,ty));
			}
		}
	}
	return;
}
void signvis(){
		soldier[x][y] ='#';
		if(dirx == 'N'){
			int col_num = x;
			int val_num = (col_num / v); 
			if(val_num > 0){
				for(int a = 0; a <= d; a += t){
					for(int b = 1; b <= val_num; b++){
						int xx = x - b*v;
						vis[a+b][xx][y] = true;
					}						
				}
			}	
		}
		else if(dirx == 'S'){
			int col_num = n - x;
			int val_num = (col_num / v);
			if(val_num > 0){
				for(int a = 0; a <= d; a += t){
					for(int b = 1; b <= val_num; b++){
						int xx = x + b*v;
						vis[a+b][xx][y] = true;
					}						
				}
			}
		}
		else if(dirx == 'W'){
			int row_num = y;
			int val_num = (row_num / v); 
			if(val_num > 0){
				for(int a = 0; a <= d; a += t){
					for(int b = 1; b <= val_num; b++){
						int yy = y - b*v;
						vis[a+b][x][yy] = true;
					}						
				}
			}
		}
		else if(dirx == 'E'){
			int row_num = m - y;
			int val_num = (row_num / v); 
			if(val_num > 0){
				for(int a = 0; a <= d; a += t){
					for(int b = 1; b <= val_num; b++){
						int yy = y + b*v;
						vis[a+b][x][yy] = true;
					}						
				}
			}
		}
} 
int main()
{
	freopen("1.txt","r",stdin);
	memset(vis,false,sizeof(vis));
	memset(soldier,'.',sizeof(soldier));
	cin>>n>>m>>k>>d;
	for(int i = 0; i <=k; i++)
	{
		cin >> dirx >> t >> v >> x >> y;
		signvis();

	}
	bfs();
	if(ans==0)
		cout<<"Bad luck!"<<endl;
	else
		cout<<ans<<endl;
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值