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

hdu Nightmare 1072

2018年04月26日 ⁄ 综合 ⁄ 共 2216字 ⁄ 字号 评论关闭

bfs()搜索,关键在于用mark[][]去标记时间

#include<stdio.h>
#include<string.h>
#include<queue>
#include<iostream>
using namespace std;
int sx,sy,ex,ey,n,m;
int mark[9][9],map[9][9],dir[4][2]={1,0,-1,0,0,1,0,-1};
struct node{
	int x,y,time,step;
};
int overmap(int x,int y)
{
	if(x<0||x>=n||y<0||y>=m)return 1;
	else return 0;
}
int bfs()
{
	memset(mark,0,sizeof(mark));//注意清零	
        queue<node>q;
	node first,next;
	first.x=sx;
	first.y=sy;
	first.time=6;
	first.step=0;
	q.push(first);
	mark[first.x][first.y]=6; //注意初始时间赋值
	while(!q.empty())
	{
	    first=q.front();
		q.pop();
		if(first.x==ex&&first.y==ey)
			return first.step;
		if(map[first.x][first.y]==4)
		{
			first.time=6;
			mark[first.x][first.y]=6;
		}
		for(int i=0;i<4;i++)
		{
			next.x=first.x+dir[i][0];
			next.y=first.y+dir[i][1];
			next.step=first.step+1;
			next.time=first.time-1;
			if(overmap(next.x,next.y)||map[next.x][next.y]==0||next.time<=0)
				continue;
			if(mark[next.x][next.y]<next.time)//如果四周时间小于当前时间,就将当前时间赋给mark[][]
			{
				mark[next.x][next.y]=next.time;
				q.push(next);
			}
		}
	}
	return -1;
//如果没有返回-1
}
int main()
{
	int k,i,j;
	scanf("%d",&k);
	while(k--)
	{
		scanf("%d%d",&n,&m);
		for(i=0;i<n;i++)
			for(j=0;j<m;j++)
			{
				scanf("%d",&map[i][j]);
				if(map[i][j]==2)
				{sx=i;sy=j;}
				if(map[i][j]==3)
				{ex=i;ey=j;}
			}
			printf("%d\n",bfs());
	}
	return 0;
}

 只用mark[][]去标记就可以

代码:

#include <iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
int map[9][9],mark[9][9],sx,sy,ex,ey,line,row;
int dir[4][2]={1,0,-1,0,0,-1,0,1};
struct node
{
    int x,y,step;
};
int overmap(int x,int y)
{
    if(x<0||x>=line||y<0||y>=row) return 1;
    else return 0;
}
int bfs()
{
    memset(mark,0,sizeof(mark));
    int ltime;
    queue<node>q;
    node first,next;
    first.x=sx;
    first.y=sy;
    first.step=0;
    q.push(first);
    mark[first.x][first.y]=6;
    while(!q.empty())
    {
        first=q.front();q.pop();
        if(first.x==ex&&first.y==ey)
        return first.step;
        if(map[first.x][first.y]==4)
        {
            mark[first.x][first.y]=6;
        }
        for(int i=0;i<4;i++)
        {
            next.x=first.x+dir[i][0];
            next.y=first.y+dir[i][1];
            next.step=first.step+1;
            ltime=mark[first.x][first.y]-1;
            if(overmap(next.x,next.y)||map[next.x][next.y]==0||ltime<=0)
            continue;
            if(mark[next.x][next.y]<ltime)
            {
                mark[next.x][next.y]=ltime;
                q.push(next);
            }
        }

    }
    return -1;
}
int main()
{
    int cases,i,j;
    scanf("%d",&cases);
    while(cases--)
    {
       scanf("%d%d",&line,&row);
       for(i=0;i<line;i++)
       {
           for(j=0;j<row;j++)
           {
               scanf("%d",&map[i][j]);
               if(map[i][j]==2)
               {sx=i;sy=j;}
               if(map[i][j]==3)
               {ex=i;ey=j;}
           }
       }
       printf("%d\n",bfs());
    }
    return 0;
}

 

抱歉!评论已关闭.