zzuli 20级第八次周赛 2746: 布丁

题目描述

布丁是一只小型泰迪犬,他的主人小Z负责出门遛它。但是布丁总是逃脱小Z的束缚,去找隔壁的小花玩耍(一只小母狗),这天小Z坚决要阻止它找小花玩耍,请问小Z能否比布丁更早或者同时到达。小Z居住的村子是一张长为n宽为m的一个矩形。小Z家在点(0,0)小花家在(x,y)。图中“0”代表道路,小Z和布丁都可以到达,“1”代表墙壁,只有布丁能够到达(布丁可以飞檐走壁,而小Z不行),小Z和布丁每秒只能向上、下、左、右某个方向移动一格并且都不能跳出村子。如果小Z可以比布丁更早或者同时到达,则输出“布丁是笨蛋”否则输出“小Z果然是最菜的”。
注意:小Z可能根本到达不了小花家哦!此时也是输出“小Z果然是最菜的”

输入

第一行输入n,m,x,y分别代表矩形的长、宽和小花家的坐标(x,y)。
第二行输入n行m列,代表小Z所住的村子,“1”代表是墙壁,“0”代表是道路,数字间以空格隔开,数据保障点(0,0)和点(x,y)都不是墙壁。
数据范围:
1<=n<=500,1<=m<=500

输出

仅输出一行,如果小Z可以比布丁更早或者同时到达,则输出“布丁是笨蛋”否则输出“小Z果然是最菜的”。注意不加引号

样例输入

3 3 2 2
0 0 0
0 1 1
0 1 0

样例输出

小Z果然是最菜的

提示

样例二:
输入:
5 5 4 3
0 1 0 1 0
0 0 1 0 1
0 1 1 1 0
0 0 0 0 0
1 0 0 0 0

输出:
布丁是笨蛋

样例一小Z无法到达点(2,2)但布丁可以到达,所以输出“小Z果然是最菜的”
样例二小Z可以从(0,0)->(1,0)->(2,0)->(3,0)->(3,1)->(4,1)->(4,2)->(4,3),走了7步,而布丁同样最少用7步才能到达(4,3),所以输出“布丁是笨蛋”

迷宫问题的入门题,

#include<bits/stdc++.h>
using namespace std;

int arr[505][505];
int a[505][505];
int d[4] = {1, -1, 0, 0};
int f[4] = {0, 0, 1, -1};

int ansz = 1e9;

int n, m;
int x, y;

//c:时间, x1 y1 当前坐标 ,a用来记录是否经过过 

void dfs(int c, int x1, int y1, int a[505][505]){
	if(x1 == x && y1 == y){
		ansz = min(ansz, c);
		return ; 
	}
	for(int i = 0; i < 4; i++){
		int n1 = x1+d[i], n2 = y1+f[i];
		
		if(n1>=0 && n2>=0 && n1<n && n2<m &&
		   arr[n1][n2]==0 && a[n1][n2]==0){
		   	
		   	a[n1][n2] = 1;
		   	dfs(c+1, n1, n2, a);
		   	a[n1][n2] = 0;
		}	
	}
} 

int main(){
	
	cin >> n >> m;
	cin >> x >> y;

	memset(arr, 0, sizeof(arr));
	memset(a, 0, sizeof(a));
	
	for(int i = 0; i < n; i++){
		for(int j = 0; j < m; j++){
			scanf("%d", &arr[i][j]);
		}
	}
	
	int ansd = x + y;   //布丁的时间 
	
	dfs(0,0,0,a);
	
	if(ansd >= ansz){
		cout << "布丁是笨蛋";
	}else{
		cout << "小Z果然是最菜的";
	}
	
}
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值