现在的位置: 首页 > 综合 > 正文

HDOJ/HDU 1072 Nightmare (bfs)

2014年02月04日 ⁄ 综合 ⁄ 共 1202字 ⁄ 字号 评论关闭

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1072

从入口到出口的最短路,4这个点要重置时间,不运行重复走,其他个点可以重复走,其中0是障碍,先前自己用深度优先不好搞,再借鉴了网上一个大牛的

转自:http://blog.csdn.net/yyf573462811/article/details/7819226

#include <iostream>
#include <string>
#include <cstdio>
#include <cmath>
#include <vector>
#include <algorithm>
#include <sstream>
#include <cstdlib>
#include <fstream>
#include <queue>
using namespace std;
int maze[20][20];
struct node  
{  
    int x,y,step,count;  
}p,q;
int n,m,sx,sy;
int dir[4][2]={{0,-1},{0,1},{1,0},{-1,0}}; 
void bfs()
{
	queue<node> Q;
	p.x=sx;
	p.y=sy;
	p.step=0;
	p.count=6;
	maze[sx][sy]=0;
	Q.push(p);
	while(!Q.empty())
	{
		p=Q.front();
		Q.pop();
		for(int i=0;i<4;i++)
		{
			q=p;
			q.x+=dir[i][0];
			q.y+=dir[i][1];
			if(q.x<=0||q.x>n||q.y<=0||q.y>m||maze[q.x][q.y]==0)continue;
			if(maze[q.x][q.y]==1){
				q.count--;
				if(q.count>=1){
					q.step++;
					Q.push(q);
				}
			//	maze[q.x][q.y]=0;     如果不允许重复,则最后一个数据无法到达 
			}
			else if(maze[q.x][q.y]==4){
				q.count--;
				if(q.count>=1){
					q.step++;
					q.count=6;
					Q.push(q);
				}
				maze[q.x][q.y]=0;     //只有4这点不能重复走,其他可重复走 
			}
		    else if(maze[q.x][q.y]==3&&q.count>1){
				q.step++;
				cout<<q.step<<endl;
				return ;
			}
		}
		
		
		
	}
	cout<<-1<<endl;
	
}
int main()
{
	int t;
//	ifstream fin;
//	fin.open("data1.txt");
	
	cin>>t;
	while(t--)
	{
		cin>>n>>m;
		for(int i=1;i<=n;i++)
		{
			for(int j=1;j<=m;j++)
			{
				cin>>maze[i][j];
				if(maze[i][j]==2){
					sx=i;
					sy=j;
				}
			}
		}
		bfs();
	}
	return 0;
}  

抱歉!评论已关闭.