Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

BFS 依次遍历 难道得到的不是最短距离?求一个例子

Posted by menglong_fan at 2017-03-17 15:03:57 on Problem 2688
#include <iostream>

using namespace std;

struct Node{
	int x, y;
	int step;
};
struct Point{
	int x, y;
};
Node queue[1024*1024];
Point Start;
Point p[25*25];
Point dir[4] = {0,1,1,0,0,-1,-1,0};
int top = 0;
int H, W;
char data[25][25];
int book[25][25];
int vis[25];
int dis[25][25];
int ans;
int bfs();
int isOk(int x, int y);

int main(int argc, char** argv)
{
	int T, test_case;
	
	freopen("input.txt", "r", stdin);

	cin >> T;
	for(test_case = 0; test_case  < T; test_case++)
	{
		cin >> W >> H;
		if (!W && !H) break;
		top = 0;
		//char tmp;
		for (int i=0; i<H; i++){
			for(int j=0; j<W; j++){
				cin >> data[i][j];
				//dis[i][j] = 0;
				if (data[i][j] == 'o'){
					Start.x = i;
					Start.y = j;
					top++;
				}
				else if(data[i][j] == '*'){
					top++;
				}
			}
		}
		//cout << "top = "<< top << endl;
		ans = 0;
		
		for(int i=1; i<top; i++){
			//printf("%d------->(%d, %d)\n",i,  Start.x, Start.y);
			int tmp = bfs();
			if (tmp!=-1) 
				ans += tmp;
			else {
				ans = -1;
				break;
			}
			//bfs();
			//cout << ans << endl;
		}
		//printf("%d------->(%d, %d)\n",4,  Start.x, Start.y);
		cout << ans << endl;
	}
	return 0;
}

int bfs()
{
	Node np, nep;
	int head, tail;
	head = tail =0;
	for (int i=0; i<25; i++)
		for (int j=0; j<25; j++)
			book[i][j] = 0;
	np.x = Start.x;
	np.y = Start.y;
	np.step = 0;
	book[np.x][np.y] = 1;
	queue[tail++] = np;

	while (head < tail){
		np = queue[head++];
		if (data[np.x][np.y] == '*'){
			data[Start.x][Start.y] = '.';
			Start.x = np.x;
			Start.y = np.y;
			data[Start.x][Start.y] = '.';
			return np.step;
		}

		for (int i=0; i<4; i++){
			nep.x = np.x + dir[i].x;
			nep.y = np.y + dir[i].y;
			if (isOk(nep.x, nep.y) && data[nep.x][nep.y]!='x' && book[nep.x][nep.y]==0){
				book[nep.x][nep.y] = 1;
				nep.step = np.step + 1;
				queue[tail++] = nep;
			}
		}
	}
	return -1;
}
int isOk(int x, int y)
{
	if (x>=0 && x<H && y>=0 && y<W) return 1;
	else return 0;
}

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator