列表

详情


NC25160. [USACO 2007 Feb B]Bronze Lilypad Pond

描述

Farmer John为了满足奶牛对美的享受而安装了人工湖。矩形的人工湖分成 行 的方形小格子。有些格子是荷叶,有些岩石,剩下的格子有的只是美丽的蓝色湖水。
Bessie通过从一片荷叶跳到另一片荷叶上来练习芭蕾。它现在正站在一片荷叶上(看输入数据了解具体位置)。它希望通过在荷叶上跳跃来到达另一片荷叶。它既不能跳到水里也不能跳到岩石上。
Bessie的跳跃有点类似象棋中马那样的移动,在一个方向上移动格,然后再在斜方向上移动格(或者是在一个方向上移动 格,然后在斜方向上移动 格)。Bessie再一个荷叶最多可能有多达8种的跳跃选择。
给出池塘的构造以及Bessie跳跃的形式,找出Bessie从起点荷叶跳到终点荷叶所需的最小的跳跃次数。数据保证有解。

输入描述

第1行: 四个空格分开的整数: M, N, M1, 和 M2
第2行至 M+1行: 第i+1行用N个空格分开的整数描述池塘第i行,0表示水,1表示 荷叶,2表示岩石,3表示Bessie现在站的那块荷叶,4表示跳跃的终点。

输出描述

输出 一个整数,是Bessie从起点荷叶跳到终点荷叶所需的最小的跳跃数。

示例1

输入:

4 5 1 2
1 0 1 0 1
3 0 2 0 4
0 1 2 0 0
0 0 0 1 0

输出:

2

说明:

Bessie在第二行的左边开始;她的目的地在第二行的右边。池塘中有几块荷叶和岩石。
Bessie聪明的跳到了(1,3)的荷叶上,再跳到目的地。

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 30ms, 内存消耗: 616K, 提交时间: 2020-02-13 13:23:19

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

int m, n, m1, m2;
int maze[35][35];
int vis[35][35];
struct node{int x, y, step;};

int main() {
	node en;
	cin>>m>>n>>m1>>m2;
	queue <node> q;
	int dir[8][2] = {{-m1, m2}, {-m2, m1}, {m1, m2}, {m2, m1}, {m1, -m2}, {m2, -m1}, {-m1, -m2}, {-m2, -m1}};
	for(int i = 1; i <= m; i++) {
		 for(int j = 1; j <= n; j++) {
		 	cin>>maze[i][j];
		 	if(maze[i][j] == 3) {
				q.push({i, j, 0});
				vis[i][j] = 1;
			}
			else if(maze[i][j] == 4) {
				en.x = i;
				en.y = j;
			} 
		 }
	}
	while(!q.empty()) {
		node st = q.front(), ne;
		q.pop();
		if(st.x == en.x && st.y == en.y) {
			cout<<st.step<<endl;
			return 0;
		}
		for(int i = 0; i < 8; i++) {
			ne.x = st.x + dir[i][0];
			ne.y = st.y + dir[i][1];
			if(ne.x < 1 || ne.x > m || ne.y < 1 || ne.y > n || vis[ne.x][ne.y] || maze[ne.x][ne.y] == 0 || maze[ne.x][ne.y] == 2) continue;
			ne.step = st.step + 1;
			vis[ne.x][ne.y] = 1;
			q.push(ne);
			}
	}
    return 0;
}

C++11(clang++ 3.9) 解法, 执行用时: 6ms, 内存消耗: 504K, 提交时间: 2020-02-26 13:39:42

#include<stdio.h>
int qux[1000],quy[1000],head=0,tail=1;
int bd[30][30];
int main()
{
	int n,m,dx,dy;
	scanf("%d%d%d%d",&n,&m,&dx,&dy);
	int mx[8]={dx,dx,-dx,-dx,dy,dy,-dy,-dy};
	int my[8]={dy,-dy,dy,-dy,dx,-dx,dx,-dx};
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<m;j++)
		{
			int v;
			scanf("%d",&bd[i][j]);
			if(bd[i][j]==3)
			{
				qux[0]=i;
				quy[0]=j;
				bd[i][j]=100;
			}
		}
	}
	while(head!=tail)
	{
		for(int i=0;i<8;i++)
		{
			#define X qux[head]+mx[i]
			#define Y quy[head]+my[i]
			#define T bd[qux[head]][quy[head]]
			if(0<=X&&X<n&&0<=Y&&Y<m)
			{
				if(bd[X][Y]==4)
				{
					printf("%d",T-99);
					return 0;
				}
				if(bd[X][Y]==1)
				{
					bd[X][Y]=T+1;
					qux[tail]=X;
					quy[tail]=Y;
					tail++;
				}
			}
		}
		head++;
	}
}

上一题