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

hdu 2757 Ocean Currents(BFS 比较简单的)

2017年11月15日 ⁄ 综合 ⁄ 共 1961字 ⁄ 字号 评论关闭

题目分析: r行,c列的矩形,每个方格内有0-7七个数字,分别代表 north, south, east, west, northeast, northwest, southeast, southwest. 七个方向,一艘船 走向它的格子所表示的方向 不消耗能量,否则消耗一个能量,从起点到终点要消耗的最小能量,

分析:每个格子可以达到的而且不消耗能量的格子,同属一个集合,一次全把它们加到队列里,直到走到终点

注意:1.忘了清空队列

           2.写代码时候要认真,老犯逻辑错误

           3.C ++提示编译错误,G++  AC了

 代码:

#include<iostream>
#include<cstdio>
#include<memory.h>
#include<queue>
using namespace std;
int r,c,n;
int maze[1100][1100],vis[1100][1100];
int dir[8][2]={{-1,0},{-1,1},{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1}};
struct node
{
	int x,y;
	int energy;
};
queue<node>q;
bool IN(int x,int y)
{
	if(1<=x&&x<=r && 1<=y&&y<=c)
		return true;
	else
		return false;
}
int main()
{
	while(scanf("%d %d",&r,&c)!=EOF)
	{
		getchar();
		for(int i=1;i<=r;i++)
		{
			for(int j=1;j<=c;j++)
			{
				char ch;
				ch=getchar();
				maze[i][j]=ch-'0';
			}
			getchar();
		}
		scanf("%d",&n);
		node start,cur,temp,temp1;
		int ans,flag;
		for(int i=1;i<=n;i++)
		{
			int rs,cs,rd,cd;
			scanf("%d %d %d %d",&rs,&cs,&rd,&cd);
			if(rs==rd&&cs==cd)
			{
				printf("0\n");
				continue;
			}
			/***忘了清空队列!!!!!*/
			while(!q.empty())
                q.pop();
			memset(vis,0,sizeof(vis));

			ans=0,flag=0;
			start.x=rs,start.y=cs,start.energy=0;
			temp1=start;
			while(IN(temp1.x,temp1.y) && vis[temp1.x][temp1.y]==0)
			{
			    if(temp1.x==rd && temp1.y==cd)
				{
					ans=0;
					printf("0\n");
					flag=1;
					break;
				}
				int x1=temp1.x,y1=temp1.y;
				q.push(temp1);
				//printf("(%d %d---%d)  ",x1,y1,temp1.energy);
				vis[x1][y1]=1;
				temp1.x=x1+dir[maze[x1][y1]][0];
				temp1.y=y1+dir[maze[x1][y1]][1];
			}
			//printf("\n");
			if(flag==1)
                continue;
			while(!q.empty())
			{
				temp=q.front();
				//printf("(%d %d %d)\n",temp.x,temp.y,temp.energy);
				q.pop();
				/***cur.energy=temp.energy+1;*/
				for(int i=0;i<8;i++)
				{
					cur.x=temp.x+dir[i][0];
					cur.y=temp.y+dir[i][1];
                    if(i==maze[temp.x][temp.y])
                        cur.energy=temp.energy;
                    else
					    cur.energy=temp.energy+1;
					temp1=cur;
					while(IN(temp1.x,temp1.y)&&vis[temp1.x][temp1.y]==0)
					{
					    if(temp1.x==rd && temp1.y==cd)
						{
							ans=temp1.energy;
							flag=1;
							break;
						}
						int x1=temp1.x,y1=temp1.y;
						q.push(temp1);
						//printf("(%d %d---%d)  ",x1,y1,temp1.energy);
						vis[x1][y1]=1;
						temp1.x=x1+dir[maze[x1][y1]][0];
						temp1.y=y1+dir[maze[x1][y1]][1];
						temp1.energy=cur.energy;
					}
					if(flag==1)
						break;
				}
				if(flag==1)
					break;
			}
			printf("%d\n",ans);
		}
	}
	return 0;
}

抱歉!评论已关闭.