uva 1600 bfs 多加一个状态

node.state代表此时已经走了几个障碍,node.step代表到达此状态需要走几步

#include <cstdio>
#include <algorithm>
#include <cstring>
#include <string>
#include <queue>
#include <iostream>
#define INF 0x3f3f3f3f
using namespace std;

typedef struct node{
	int x;
	int y;
	int state;
	int step;
	node(int p = 0, int q = 0, int o = 0, int u = 0):x(p), y(q), state(o), step(u){}
}node;

int dx[4] = {0,-1,0,1};
int dy[4] = {-1,0,1,0};
int a[30][30];
int m, n, k;
queue<node> que;

int dis[30][30];
int vis[30][30][30];

int bfs()
{
	while(!que.empty())
		que.pop();
	for(int i = 0; i < 30; i++)
	for(int j = 0; j < 30; j++)
	for(int k = 0; k < 30; k++)
		vis[i][j][k] = 0;
	vis[1][1][0] = 1;
	que.push(node(1,1,0,0));
	while(!que.empty())
	{
		node front = que.front();
		que.pop();
		if(front.x == m && front.y == n)
			return front.step;
		for(int i = 0; i < 4; i++)
		{
			int x = front.x + dx[i];
			int y = front.y + dy[i];
			if(a[x][y] == -1)
				continue;
			if(a[x][y] == 1)
			{
				if(front.state + 1 > k)
					continue;
				else
				if(!vis[x][y][front.state+1])
				{
					que.push(node(x, y, front.state+1, front.step+1));
					vis[x][y][front.state+1] = 1;
				}
			}
			if(a[x][y] == 0 && !vis[x][y][0])
			{
				vis[x][y][0] = 1;
				que.push(node(x, y, 0, front.step+1));
			}
		}
	}
	return -1;
}
		
int main()
{
	//freopen("ztest.txt","r",stdin);
	//freopen("zans.txt","w",stdout);
	int t;
	scanf("%d", &t);
	while(t--)
	{
		memset(a, -1, sizeof(a));
		scanf("%d%d%d", &m, &n, &k);
		for(int i = 1; i <= m; i++)
		for(int j = 1; j <= n; j++)
			scanf("%d", &a[i][j]);
		printf("%d\n", bfs());
	}
	return 0;
}
		

猜你喜欢

转载自blog.csdn.net/wukongakk/article/details/81070883