程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> POJ Meteor Shower BFS 水~

POJ Meteor Shower BFS 水~

編輯:C++入門知識

 

題目大意:

一個人從(0,0)出發,這個地方會落下隕石,當隕石落在(x,y)時,會把(x,y)這個地方和相鄰的的四個地方破壞掉,求該人到達安全地點的最小時間,若無解輸出-1

思路:

好吧,我最近都在做水題。

輸入的時候更新地圖,每個點取最小的被破壞的時間,然後進行BFS,在BFS途中,如果當前時間>=被破壞的,那麼就代表不能進入。

 

 

 

#include
#include
#include
#include
using namespace std;
const int MAXN=300+10;
const int dx[]={1,-1,0,0,0};
const int dy[]={0,0,1,-1,0};
int map[MAXN][MAXN];
bool vis[MAXN][MAXN];
void update(int x,int y,int t)
{
	if(x<0||y<0) return;
	if(map[x][y] !=-1 && map[x][y]<=t) return;
	map[x][y]=t;
}

struct state
{
	int x,y,t;
	state(int x=0,int y=0,int t=0):x(x),y(y),t(t){}
};

int bfs()
{
	memset(vis,0,sizeof(vis));
	queue q;
	q.push(state(0,0,0));
	while(!q.empty())
	{
		state cur=q.front();
		q.pop();
		for(int i=0;i<4;i++)
		{
			int nx=cur.x+dx[i];
			int ny=cur.y+dy[i];
			if( nx<0 || ny<0 ) continue;
			if(map[nx][ny]==-1) return cur.t+1;
			int nt=cur.t+1;
			if( vis[nx][ny] || nt>=map[nx][ny]) continue;
			q.push(state(nx,ny,nt));
			vis[nx][ny]=true;
		}
	}
	return -1;
}
int main()
{
	int m;
	while(~scanf(%d,&m))
	{
		memset(map,-1,sizeof(map));
		for(int i=0;i

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved