ZOJ 2655 Water Pipe bfs 带方向状态

链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2655

Water Pipe


Time Limit: 5 Seconds     
Memory Limit: 32768 KB



Two waterworks want to connect to each other with water pipes. Just as the map shows, the waterworks sit on two corners of the city. The city is a rectangle, and is divided into a lot of small squares. Water pipes are placed in these squares. Only one pipe
can be placed in each square. There are two types of pipe: straight pipe and bend pipe. You can rotate them if necessary. Two types of pipe have different prices. You are assigned to calculate the minimum cost to connect the two waterworks.

Input:

There are several test cases. Each test case contains two parts.

The first part is a line of for integers: the width of the city, the length of the city, the price of the straight pipe, the price of the bend pipe(1<=width,length<=100, 0<=price<=100).

The second part is a map of the city, "b" stands for block on that square, while "*" stands for a blank square which you can place water pipe in.

Output:

For each test case, print in one line the minimum cost to connect the waterworks. If can not to connect to each other, output "impossible".

Sample Input:

1 2 3 4
*
*
5 5 8 0
b****
*****
**bb*
**bb*
*****
5 5 8 10
b****
*****
**bb*
**bb*
*****
1 1 38 89
*
1 1 3 3
b

Sample Output:

8
8
76
38
impossible

题意:

从右上角出发到左下角。搭一个直水管花费str,弯的ben。

问最小搭水管的花费。

做法

直接可以从地图右上角也就是( 1,n)点 出发,初始方向是向左的。注意此时还没有搭任何的水管。方向是因为从左边那个水厂流入所以向左。

然后就是在这个格子建水管,如果建直水管,他就继续向左,然后花费直水管的钱,到达(1,n-1)点,然后当前方向还是向左,然后在vis数组记录最小步数。

注意走的时候,只能走三个方向,要么转弯,要么直走,不能往回走,和题目矛盾,也没什么意义。

然后到达终点旁边的 那个格子的时候,此时,这个格子还没建造水管,如果此时向下,你可以花费转弯水管的钱让他到达终点,

如果此时向左,那么只用花费 直水管的钱让他到达终点。

如果其他两个方向,是无法更新答案的。

.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <limits.h>
#include <malloc.h>
#include <ctype.h>
#include <math.h>
#include <string>
#include <iostream>
#include <algorithm>
using namespace std;
#include <stack>
#include <queue>
#include <vector>
#include <deque>
#include <set>
#include <map>

#define inf 0x7f7f7f7f
int dir[4][2]={1,0,0,1,-1,0,0,-1};

struct point
{
	int x,y;
	int ff;//在当前位置 朝向哪里
	int cost;
	bool operator <(const point& b)const
	{
		return cost>b.cost;
	}
};

int vis[110][110][4];
char mp[110][110];
int n,m;
int vst(point a)
{
	if(a.x<1||a.x>n||a.y<1||a.y>m)
		return 0;
	if(mp[a.x][a.y]=='b')
		return 0;
	if(vis[a.x][a.y][a.ff]>a.cost)
	{
		vis[a.x][a.y][a.ff]=a.cost;
		return 1;
	}
	return 0;
}

int str,ben;// zhijia  wanjia
int ans;

// 最优路径 不会有重叠出现

void bfs()
{
	priority_queue<point>q;
	memset(vis,inf,sizeof vis);
	point sta,nxt,nw;
	sta.x=1;
	sta.y=m;
	sta.ff=3;
	sta.cost=0;
	if(vst(sta))
	q.push(sta);
	ans=inf;
	while(!q.empty())
	{
		nw=q.top();
		//printf("%d\n",nw.cost);
		if(nw.x==n&&nw.y==1)
		{
			if(nw.ff==3)
				ans=min(ans,nw.cost+str);
			else if(nw.ff==0)
				ans=min(ans,nw.cost+ben);
		}
		q.pop();
		for(int i=-1;i<=1;i++)
		{
			int tur=(nw.ff+i+4)%4;
			nxt=nw;
			nxt.ff=tur;
			nxt.x+=dir[tur][0];
			nxt.y+=dir[tur][1];
			if(i==0)
				nxt.cost+=str;
			else
				nxt.cost+=ben;
			if(vst(nxt))
			{
				q.push(nxt);
			}
		}
	} 

}
int main()
{
	while(scanf("%d%d%d%d",&m,&n,&str,&ben)!=EOF)
	{
		for(int i=1;i<=n;i++)
			scanf("%s",mp[i]+1);
		bfs();
		if(ans!=inf)
		printf("%d\n",ans);
		else
			printf("impossible\n");
	}
	return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-12 02:15:24

ZOJ 2655 Water Pipe bfs 带方向状态的相关文章

[poj 2331] Water pipe ID A*迭代加深搜索(dfs)

Water pipe Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 2265 Accepted: 602 Description The Eastowner city is perpetually haunted with water supply shortages, so in order to remedy this problem a new water-pipe has been built. Builders s

POJ2331:Water pipe(IDA*)

Description The Eastowner city is perpetually haunted with water supply shortages, so in order to remedy this problem a new water-pipe has been built. Builders started the pipe from both ends simultaneously, and after some hard work both halves were

Zoj 2913 Bus Pass BFS

题意: 给你一张图,和一些指定的点,找一个点使得这些指定的点到这个点的距离的最大值最小 对每一个指定的点都做一遍BFS,更新到达每个点的距离,取较大值,然后扫一遍所有的点,找出最小即可. 注意:不同于走格子,因为方向比较多,所以要在扩展节点的时候就更新vis数组,不然有可能导致某个点的距离因为重复更新而不是最小值. 并且不要漏了一开始就更新起点的vis #include <cstdio> #include <vector> #include <cstring> #inc

ZOJ 1639 Hang Up the System (状态压缩)

Hang Up the System Time Limit: 2 Seconds      Memory Limit: 32768 KB You're going to design a multi-task operating system for an embedded system. Because the resources are limited on this mini computer, parallel running of some programs will probably

[dp] zoj 3740 Water Level

题目链接: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5122 Water Level Time Limit: 2 Seconds      Memory Limit: 65536 KB Hangzhou is a beautiful city, especially the West Lake. Recently, the water level of the West Lake got lower and lower

ZOJ - 3890 Wumpus(BFS基础题)

Wumpus Time Limit: 2 Seconds      Memory Limit: 65536 KB One day Leon finds a very classic game called Wumpus.The game is as follow. Once an agent fell into a cave. The legend said that in this cave lived a kind of monster called Wumpus, and there we

水流(water)(BFS)(DFS)

水流(water) 时间限制: 1 Sec  内存限制: 64 MB提交: 9  解决: 2[提交][状态][讨论版] 题目描述 全球气候变暖,小镇A面临水灾,于是你必须买一些泵把水抽走.泵的抽水能力可以认为是无穷大,但你必须把泵放在合适的位置,从而能使所有的水能流到泵里. 小镇可以认为是N×M的矩阵,矩阵里的每个单元格都是一个a-z小写字母,该小写字母表示该格子的高度,字母大的表示该单元格比较高,反之表示该格子高度 比较低.当前单元格的水可以流到上.下.左.右四个格子,但必须满足这些格子的高度

zoj 3478 Binary Land bfs

链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3478 Binary Land Time Limit: 2 Seconds      Memory Limit: 65536 KB Binary Land is a very simple action title for the Famicom with an interesting twist. You control, not one, but two peng

HDU 1175 连连看 (BFS带方向的判定)

连连看 Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 23172    Accepted Submission(s): 5710 Problem Description “连连看”相信很多人都玩过.没玩过也没关系,下面我给大家介绍一下游戏规则:在一个棋盘中,放了很多的棋子.如果某两个相同的棋子,可以通过一条线连起来(这条线不能经过其