您的位置:首页 > 编程语言 > C语言/C++

NYOJ 58 最少步数(BFS)

2015-06-13 11:00 357 查看
时间限制:3000 ms  |  内存限制:65535 KB
难度:4

描述

这有一个迷宫,有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


#include <iostream>
#include <cstring>
#include <string>
#include <queue>

using namespace std;

typedef struct Node
{
int lhs,rhs;
}Node;

const int ans[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},
};

const int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};

int dp[9][9];
int visited[9][9];

Node m3;

void BFS(Node t)
{
queue<Node>	q;
Node tt;

while (1)
{
if((t.lhs==m3.lhs) && (t.rhs==m3.rhs))
break;

for(int i=0;i<4;i++)
{
tt.lhs=t.lhs+dir[i][0];
tt.rhs=t.rhs+dir[i][1];
if (tt.lhs>=0 && tt.lhs<9 && tt.rhs>=0 && tt.rhs<9)
if(0==visited[tt.lhs][tt.rhs] && 0==ans[tt.lhs][tt.rhs])
{
visited[tt.lhs][tt.rhs]=1;
dp[tt.lhs][tt.rhs]=dp[t.lhs][t.rhs]+1;
q.push(tt);
}
}
t=q.front();
q.pop();
}

}

int main()
{
int n;
Node m1;
cin>>n;
while(n--)
{
cin>>m1.lhs>>m1.rhs>>m3.lhs>>m3.rhs;

memset(dp,0,sizeof(dp));
memset(visited,0,sizeof(visited));

visited[m1.lhs][m1.rhs]=1;
BFS(m1);

cout<<dp[m3.lhs][m3.rhs]<<endl;

}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++ acm bfs