首页 > 其他分享 >洛谷P4554 小明的游戏

洛谷P4554 小明的游戏

时间:2024-08-03 10:00:02浏览次数:9  
标签:小明 洛谷 int P4554 second 510 fi now dis

小明的游戏

题目描述

小明最近喜欢玩一个游戏。给定一个n×m的棋盘,上面有两种格子#@。游戏的规则很简单:给定一个起始位置和一个目标位置,小明每一步能向上,下,左,右四个方向移动一格。如果移动到同一类型的格子,则费用是0,否则费用是1。请编程计算从起始位置移动到目标位置的最小花费。

输入格式

输入文件有多组数据。
输入第一行包含两个整数n,m,分别表示棋盘的行数和列数。
输入接下来的n行,每一行有m个格子(使用#或者@表示)。
输入接下来一行有四个整数x1​,y1​,x2​,y2​,分别为起始位置和目标位置。
当输入n,m均为0时,表示输入结束。

输出格式

对于每组数据,输出从起始位置到目标位置的最小花费。每一组数据独占一行。

输入输出样例

输入 #1复制

2 2
@#
#@
0 0 1 1
2 2
@@
@#
0 1 1 0
0 0

输出 #1复制

2
0

说明/提示

对于20%的数据满足:1≤n,m≤10。
对于40%的数据满足:1≤n,m≤300。
对于100%的数据满足:1≤n,m≤500。

代码: 

#include <bits/stdc++.h>
using namespace std;
#define int long long//宏定义 
#define PII pair<int,int> 
#define fi first
int dx[4]={-1,1,0,0},dy[4]={0,0,-1,1};//向四个方向移动 
int n,m,sx,sy,ex,ey;
//注意输入的起始和终止坐标都是从0开始的,计算和输出是横纵坐标各要加一 
char sn[510][510];//存棋盘 
int dis[510][510];//存到达某点的花费 
bool vis[510][510];//存某点是否搜过 
void distra(){//模板 改动 
	for(int i = 1;i<=n;i++){
		for(int j = 1;j<=m;j++){
			dis[i][j]=1e18;
			vis[i][j]=0;//!!!掉的第一个坑 忘记初始化为0 只能完成第一组数据 
		}
	}
	priority_queue<pair<int,PII>,vector<pair<int,PII>>,greater<pair<int,PII>> > q;
	//从小到大排序 
	q.push({0,{sx+1,sy+1}});//!!!掉的第二个坑,没注意给的数据横纵坐标从0开始 
	dis[sx+1][sy+1]=0;//起点的花费为0 
	while(q.size()){
		auto t=q.top();//取对头,注意为q.top()而不是q.front() 
		q.pop();//出队 
		auto now=t.second;//取当前点坐标 
		if(vis[now.fi][now.second]==1) continue;//如果这个点搜过了就不搜 
		vis[now.fi][now.second]=1;
		for(int i = 0;i<=3;i++){//向四个方向移动 
			int a=now.fi+dx[i],b=now.second+dy[i];
			if(a>=1&&a<=n&&b>=1&&b<=m){//判断是否越界 
				if(sn[a][b]==sn[now.fi][now.second]&&dis[a][b]>dis[now.fi][now.second]){
					//判断两个格子是否一样并且得到较小值 
					dis[a][b]=dis[now.fi][now.second];
					q.push({dis[a][b],{a,b}});//入队 
				}else if(sn[a][b]!=sn[now.fi][now.second]&&dis[a][b]>dis[now.fi][now.second]+1){
					dis[a][b]=dis[now.fi][now.second]+1;
					q.push({dis[a][b],{a,b}});
				}
			}
		}
	}
}
signed main(){
	while(1){//多组数据 
		cin >> n >> m;
		if(n==0&&m==0) break;//结束循环的判断 
		for(int i = 1;i<=n;i++){
			for(int j = 1;j<=m;j++){
				cin >> sn[i][j];//输入棋盘 
			}
		}
		cin >> sx>>sy>>ex>>ey;
		distra();
		cout << dis[ex+1][ey+1]<<"\n";//!!!注意横纵坐标加一 
	}
	return 0;
} 

标签:小明,洛谷,int,P4554,second,510,fi,now,dis
From: https://blog.csdn.net/wxz_y/article/details/140885986

相关文章

  • 洛谷 P1080 [NOIP2012 提高组] 国王游戏
    一道非常有挑战性的题目(~太难了~)。这题我们可以用贪心来做。思路:首先我们定义一个结构体struct,里面放的是每个人左手和右手的数字。接着我们需要一种排列方式,使得获得奖赏最多的大臣,所获奖赏尽可能的少;这句话听起来是不是听绕口?意思就是说得到奖赏数量最多,但加起来的总奖赏......
  • 洛谷-P3869 [TJOI2009] 宝藏
    Abstract传送门本题是状态压缩+记忆化BFS的典型例子。Idea要求从出发点到终点的最短步数,BFS自然是首选的方法,那么,如何构造搜索的每一个节点呢?考虑到机关的数量比较小,最多10种,我们可以考虑用状态压缩去描述机关当前的状态,然后再记录当前的横纵坐标,以及行走的步数即可。值得......
  • 洛谷 P1052 [NOIP2005 提高组] 过河
    原题https://www.luogu.com.cn/problem/P1052题目描述在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧。在桥上有一些石子,青蛙很讨厌踩在这些石子上。由于桥的长度和青蛙一次跳过的距离都是正整数,我们可以把独木桥上青蛙可能到达的点看成数轴上的一串整点:1,⋯,L......
  • 洛谷P3161 [CQOI2012] 模拟工厂 贪心策略的思考
    P3161[CQOI2012]模拟工厂传送门:模拟工厂问题描述:初始的生产力和商品分别为1和0。每一个时刻可以选择两个动作:生产力+1或者生产生产力数量的商品。现在有很多个订单,每个订单有三个部分:时间t,需要多少商品p,可以获得的价值v。现在需要决定各个时刻的动作选择,以及订单是否接取,以期......
  • 洛谷题单指南-前缀和差分与离散化-P3029 [USACO11NOV] Cow Lineup S
    原题链接:https://www.luogu.com.cn/problem/P3029题意解读:不同的坐标位置有不同种类的牛,要计算一个最小的区间,包括所有种类的牛。解题思路:由于坐标位置不连续,并且数值范围较大,因此需要离散化处理,将坐标处理成1~n连续分布由于种类编号数值范围也比较大,也需要离散化处理,去重后的......
  • 洛谷P2801 教主的魔法之分块板子
    洛谷P2801题解传送锚点摸鱼环节教主的魔法题目描述教主最近学会了一种神奇的魔法,能够使人长高。于是他准备演示给XMYZ信息组每个英雄看。于是\(N\)个英雄们又一次聚集在了一起,这次他们排成了一列,被编号为\(1,2,\ldots,N\)。每个人的身高一开始都是不超过\(1000\)......
  • 洛谷 B3612 【深进1.例1】求区间和
    "这道题也太水了吧,模拟就行了!""数据范围...""好像不行呀""呜呜~~TLE!"献上暴力代码!#include<bits/stdc++.h>usingnamespacestd;constintN=1e5+5;intn,a[N],m;signedmain(){ios::sync_with_stdio(0);cin.tie(0);......
  • 洛谷题单指南-前缀和差分与离散化-P4552 [Poetize6] IncDec Sequence
    原题链接:https://www.luogu.com.cn/problem/P4552题意解读:对一组数字序列,进行若干次区间+1或者-1操作,最终使得所有数字一样,计算最少的操作次数,以及能得到多少种不同序列。解题思路:要使得序列每一个数字都相同,则其差分除了第一项之外其余项都是0。因此,问题转化为:给定一个差分数......
  • 洛谷题单指南-前缀和差分与离散化-P2882 [USACO07MAR] Face The Right Way G
    原题链接:https://www.luogu.com.cn/problem/P2882题意解读:一个有F、B组成的序列,每次可以翻转k个连续子序列,翻转:F->B,B->F,计算最少翻转多少次可以将序列都变成F,并求相应的k。解题思路:为方便处理,设F为1,B为01、朴素做法枚举k:1~n  枚举序列,一旦遇到0,就将连续k个字符翻转,如果可......
  • 洛谷P2696之慈善的约瑟夫——题解
    洛谷P2696题解[传送锚点](P2696慈善的约瑟夫-洛谷|计算机科学教育新生态(luogu.com.cn))比不过大佬,从蒟蒻做起选择比较水有意思的解法——用队列模拟(还是窝太弱了)正片开始考虑队列模拟,因为每次都是假的剔除,所以我们的目标是找到每回游戏的最终存活者。将不被剔除,......