程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> HDU 2612 -Find a way (注意細節的BFS)

HDU 2612 -Find a way (注意細節的BFS)

編輯:C++入門知識

題目鏈接:Find a Way

題目不難,前幾天做,當時准備寫雙向BFS的,後來處理細節上出了點問題,趕上點事擱置了,今天晚上重寫的,沒用雙向,用了兩次BFS搜索,和雙向BFS 道理差不多,只是這題有個小坑,需要注意

1.Y不能經過M,M不能經過Y,也就是說有Y和M的格子,可以默認為是牆

2.必須是Y和M都能到達的KFC才行,只是其中一個到達不行


例如下列數據;答案既不是22 也不是 88 而是110,左下角的KFC滿座條件

5 5
Y..#@
...M.
....#
.....
@....
小小的坑我了一下。。。。

感謝昵稱: zstu_JayYe傑 不是看了他在Discuss板裡的留言,估計我也想不到

31MS 852K

代碼很渣,嘩嘩。。

#include 
#include 
#include 
#include 
#include 
const int N = 1e6;
const int M = 220;
using namespace std;
char mapp[M][M];
bool vis1[M][M],vis2[M][M];
int dis1[M][M],dis2[M][M],n,m,l;
struct node
{
	int x,y,a;
	node()
	{  x = 0; y = 0;a = 0;  }
};
struct noDe{
    int x,y;
}kfc[40010];
int mv[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
void BFS(int x,int y,bool visit[M][M],int ans[M][M])
{
    node f,t;
    queueq;
    visit[x][y]=true;
    f.a = 0;
	f.x=x;
	f.y=y;
	q.push(f);
	while(!q.empty())
	{
        t = q.front();
		 q.pop();
		 if(mapp[t.x][t.y]=='@')
             ans[t.x][t.y] = t.a;
		 for(int i=0;i<4;i++)
		 {
			 f.x=t.x+mv[i][0];
			 f.y=t.y+mv[i][1];
			 if(!visit[f.x][f.y]&&0<=f.x&&f.x dis1[kfc[i].x][kfc[i].y] + dis2[kfc[i].x][kfc[i].y])
                if(dis1[kfc[i].x][kfc[i].y]!=0&&dis2[kfc[i].x][kfc[i].y]!=0)
                minn = dis1[kfc[i].x][kfc[i].y] + dis2[kfc[i].x][kfc[i].y];
        }
		printf("%d\n",minn*11);
	}
	return 0;
}


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