题目描述
布丁是一只小型泰迪犬,他的主人小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果然是最菜的";
}
}