BZOJ 2464 中山市选 2009 小明的游戏 最短路

题目大意:给出一个地图,如果经过两个不同的区块,需要花费1,否则不需要花费。问从st到ed最小需要花费多少。

思路:签到题。

#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define MAX 510
#define MAXP 250010
#define MAXE 2000010
using namespace std;
const int dx[] = {0,1,-1,0,0};
const int dy[] = {0,0,0,1,-1};

struct Status{
	int pos,len;

	Status(int _,int __):pos(_),len(__) {}
	bool operator <(const Status &a)const {
		return len > a.len;
	}
};

char src[MAX][MAX];
int num[MAX][MAX];
int head[MAXP],total;
int next[MAXE],aim[MAXE],length[MAXE];

int st,ed,m,n;
int f[MAXP];

inline void Initialize()
{
	total = 0;
	memset(head,0,sizeof(head));
}

inline void Add(int x,int y,int len)
{
	next[++total] = head[x];
	aim[total] = y;
	length[total] = len;
	head[x] = total;
}

inline int SPFA()
{
	static priority_queue<Status> q;
	while(!q.empty())	q.pop();
	memset(f,0x3f,sizeof(f));
	q.push(Status(st,0));
	f[st] = 0;
	while(!q.empty()) {
		Status now = q.top(); q.pop();
		if(f[now.pos] < now.len)	continue;
		int x = now.pos;
		for(int i = head[x]; i; i = next[i])
			if(f[aim[i]] > f[x] + length[i]) {
				f[aim[i]] = f[x] + length[i];
				q.push(Status(aim[i],f[aim[i]]));
			}
	}
	return f[ed];
}

int main()
{
	while(scanf("%d%d",&m,&n),m + n) {
		Initialize();
		for(int i = 1; i <= m; ++i)
			scanf("%s",src[i] + 1);
		int cnt = 0;
		for(int i = 1; i <= m; ++i)
			for(int j = 1; j <= n; ++j)
				num[i][j] = ++cnt;
		int x,y;
		scanf("%d%d",&x,&y);
		x++,y++,st = num[x][y];
		scanf("%d%d",&x,&y);
		x++,y++,ed = num[x][y];
		for(int i = 1; i <= m; ++i)
			for(int j = 1; j <= n; ++j)
				for(int k = 1; k <= 4; ++k) {
					int fx = i + dx[k];
					int fy = j + dy[k];
					if(!fx * fy || fx > m || fy > n)	continue;
					Add(num[i][j],num[fx][fy],src[fx][fy] != src[i][j]);
				}
		printf("%d\n",SPFA());
	}
	return 0;
}

CODE:

时间: 2024-10-12 19:20:27

BZOJ 2464 中山市选 2009 小明的游戏 最短路的相关文章

bzoj2464: 中山市选[2009]小明的游戏(最短路)

2464: 中山市选[2009]小明的游戏 题目:传送门 题解: 最短路的裸题... 代码: 1 #include<cstdio> 2 #include<cstring> 3 #include<cstdlib> 4 #include<algorithm> 5 #include<cmath> 6 using namespace std; 7 int dx[5]={0,1,-1,0,0}; 8 int dy[5]={0,0,0,-1,1}; 9 st

BZOJ2464: 中山市选[2009]小明的游戏

2464: 中山市选[2009]小明的游戏 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 280  Solved: 124[Submit][Status] Description 小 明最近喜欢玩一个游戏.给定一个n * m的棋盘,上面有两种格子#和@.游戏的规则很简单:给定一个起始位置和一个目标位置,小明每一步能向上,下,左,右四个方向移动一格.如果移动到同一类 型的格子,则费用是0,否则费用是1.请编程计算从起始位置移动到目标位置的最小花费.

bzoj 2441 [中山市选2011]小W的问题

bzoj 2441 [中山市选2011]小W的问题 Description 有一天,小W找了一个笛卡尔坐标系,并在上面选取了N个整点.他发现通过这些整点能够画出很多个"W"出来.具体来说,对于五个不同的点(x1, y1), (x2, y2), (x3, y3), (x4, y4), (x5, y5),如果满足: ·x1 < x2 < x3 < x4 < x5 ·y1 > y3 > y2 ·y5 > y3 > y4 则称它们构成一个&quo

BZOJ 2466: [中山市选2009]树( 高斯消元 )

高斯消元解异或方程组...然后对自由元进行暴搜.树形dp应该也是可以的... -------------------------------------------------------------------------------------- #include<cstdio> #include<cstring> #include<algorithm> #include<bitset> using namespace std; const int ma

BZOJ 2463: [中山市选2009]谁能赢呢?【博弈】

这题不科学~~本以为鬼谷子的钱袋是能在BZOJ写的最短的程序了,这题还要短…..好吧,思考难度神马的还是有点的(至少对我这种蒟蒻来说).很明显这是道博弈论的题目,在纸上画出了n=1~4的博弈树,发现bob和alice是交替出现的…0.0 当时就在想不会这么巧吧.忍不住百度了下解题,果然是这样的,不过解题上说结论归纳可得....弱弱的写一个自己的理解.设小明和小红交替下棋为一个周期,则根据规则一个周期内小红和小明下的棋的形状将是一个1*2的长方形,很容易得出n*n的棋盘当且仅当n为偶数时能被1*2

BZOJ 2463: [中山市选2009]谁能赢呢?[智慧]

明和小红经常玩一个博弈游戏.给定一个n×n的棋盘,一个石头被放在棋盘的左上角.他们轮流移动石头.每一回合,选手只能把石头向上,下,左,右四个方向移动一格,并且要求移动到的格子之前不能被访问过.谁不能移动石头了就算输.假如小明先移动石头,而且两个选手都以最优策略走步,问最后谁能赢? 法1:打表瞎猜,奇负偶胜 法2:看别人题解 http://www.cnblogs.com/iwtwiioi/p/4161161.html 首先对于n是偶数,一定能被1*2的骨牌覆盖!所以从起点开始,先手一定走的是骨牌的

【BZOJ2464】【中山市选2009】小明的游戏 最短路水过

题解:最短路pqspfa200ms,一眼题, 另一种想出来没写的做法:二分答案,上界n+m 时间复杂度O(n*m*log(n+m)),二分+深搜看能不能找到t 最短路代码: #include <queue> #include <cstdio> #include <cstring> #include <algorithm> #define N 505 #define NN 251000 #define inf 0x3f3f3f3f using namespac

[BZOJ - 2463] [中山市选2009] 谁能赢呢?【“博弈论”】

题目链接:BZOJ - 2463 题目分析 这道题的题解是,由于两人都采取最优策略,所以最后一定所有格子都会被走到.(Why..表示不懂..哪位神犇可以给我讲一下QAQ) 于是..就变成了判断 n*n 的奇偶性,也就是判断 n 的奇偶性.. 代码 #include <cstdio> using namespace std; int main() { int n; while (true) { scanf("%d", &n); if (n == 0) break; i

bzoj 2463: [中山市选2009]谁能赢呢?

我曹,以为是什么什么SG函数,什么神奇的博弈论,我曹,不会啊(雾) 看了一眼题解,短小,直接关掉开始写奇偶.233 1 #include<bits/stdc++.h> 2 #define N 100005 3 #define LL long long 4 #define inf 0x3f3f3f3f 5 #define ls tr[x][0] 6 #define rs tr[x][1] 7 using namespace std; 8 inline int ra() 9 { 10 int x=