C - 最少步数

题目描述

这有一个迷宫,有0~8行和0~8列:

 1,1,1,1,1,1,1,1,1
 1,0,0,1,0,0,1,0,1
 1,0,0,1,1,0,0,0,1
 1,0,1,0,1,1,0,1,1
 1,0,0,0,0,1,0,0,1
 1,1,0,1,0,1,0,0,1
 1,1,0,1,0,1,0,0,1
 1,1,0,1,0,0,0,0,1
 1,1,1,1,1,1,1,1,1

0表示道路,1表示墙。

现在输入一个道路的坐标作为起点,再如输入一个道路的坐标作为终点,问最少走几步才能从起点到达终点?

(注:一步是指从一坐标点走到其上下左右相邻坐标点,如:从(3,1)到(4,1)。)

输入

第一行输入一个整数n(0<n<=100),表示有n组测试数据;
随后n行,每行有四个整数a,b,c,d(0<=a,b,c,d<=8)分别表示起点的行、列,终点的行、列。

输出

输出最少走几步。

样例输入

2
3 1  5 7
3 1  6 7
#include<bits/stdc++.h>
#include<queue>
struct Node
{
	int x;
	int y;
	int step;
	Node(){}
	Node(int xx ,int yy , int sstep) : x(xx) , y(yy) , step(sstep){}
}P[2333];
int x,y,ex,ey;
const int  dx[] = {0 , 0 , 1 , -1};
const int  dy[] = {1 , -1 , 0 , 0};
int a[9][9] = { 
1,1,1,1,1,1,1,1,1,
1,0,0,1,0,0,1,0,1,
1,0,0,1,1,0,0,0,1,
1,0,1,0,1,1,0,1,1,
1,0,0,0,0,1,0,0,1,
1,1,0,1,0,1,0,0,1,
1,1,0,1,0,1,0,0,1,
1,1,0,1,0,0,0,0,1,
1,1,1,1,1,1,1,1,1,}, book[15][15];
using namespace std;
 
int bfs(int x,int y,int step)
{
	queue<Node> A;
	A.push(Node(x,y,step));
	while(!A.empty())
	{
		Node u = A.front();
		A.pop();
		if(u.x == ex && u.y == ey)
		{
			return u.step;
		}
		for(int i = 0 ; i < 4 ; i++)
		{
			int xx = u.x + dx[i];
			int yy = u.y + dy[i];
			int zz = u.step +1;
			if(a[xx][yy] == 0 && book[xx][yy] == 0)
			{
				book[xx][yy] = 1;
				A.push(Node(xx,yy,zz));
			}
		}
		
	}
	return  0;
 
}
 
int main()
{
	int T;
	cin>>T;
	while(T--)
	{
		memset(book,0,sizeof(book));
		cin>>x>>y>>ex>>ey;
		book[x][y] = 1;
		cout<< bfs(x,y,0) <<endl;
		
 
		
	}
	
}

样例输出

12
11

题目描述

这有一个迷宫,有0~8行和0~8列:

 1,1,1,1,1,1,1,1,1
 1,0,0,1,0,0,1,0,1
 1,0,0,1,1,0,0,0,1
 1,0,1,0,1,1,0,1,1
 1,0,0,0,0,1,0,0,1
 1,1,0,1,0,1,0,0,1
 1,1,0,1,0,1,0,0,1
 1,1,0,1,0,0,0,0,1
 1,1,1,1,1,1,1,1,1

0表示道路,1表示墙。

现在输入一个道路的坐标作为起点,再如输入一个道路的坐标作为终点,问最少走几步才能从起点到达终点?

(注:一步是指从一坐标点走到其上下左右相邻坐标点,如:从(3,1)到(4,1)。)

输入

第一行输入一个整数n(0<n<=100),表示有n组测试数据;
随后n行,每行有四个整数a,b,c,d(0<=a,b,c,d<=8)分别表示起点的行、列,终点的行、列。

输出

输出最少走几步。

样例输入

2
3 1  5 7
3 1  6 7

样例输出

12
11

猜你喜欢

转载自blog.csdn.net/qq_43568078/article/details/84876829
今日推荐