最少步数
时间限制: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
wa了次 有点伤心 忘记走过要标记为1了 导致 内存超限
上代码:
bfs
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <queue>
#include <math.h>
using namespace std;
int cx[4][2] = {0,1,0,-1,1,0,-1,0}; //上下左右4个方向
int x,y,x2,y2;
struct node
{
int x,y;
int step;
} now; //now代表当前位置
void bfs(int a[9][9])
{
node next; //next代表下一位置
queue<node>q; //建立优先队列
q.push(now);
while (!q.empty())
{
now = q.front();
q.pop();
if (now.x == x2&&now.y == y2) //如果起点和终点相同 输出
{
printf("%d\n",now.step);
return;
}
for (int i=0; i<4; i++) //上下左右4个方向
{
next.x = now.x+cx[i][0];
next.y = now.y+cx[i][1];
next.step = now.step+1;
if (next.x>=0&&next.x<9&&next.y>=0&&next.y<9&&a[next.x][next.y]!=1) //满足规定条件
{
if (next.x == x2&&next.y == y2) //当走到规定位置输出
{
printf("%d\n",next.step);
return;
}
next.step = now.step+1; //否则步数加1
a[next.x][next.y]=1; //走过的位置标记为 不能走 的状态
q.push(next);
}
}
}
}
int main()
{
int n;
scanf("%d",&n);
for (int i=0; i<n; i++)
{
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
};
scanf("%d%d%d%d",&x, &y, &x2, &y2);
now.x= x;
now.y = y;
now.step = 0;
bfs(a);
}
return 0;
}
dfs
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <queue>
#include <math.h>
using namespace std;
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
};
int cx[4][2] = {0,1,0,-1,1,0,-1,0}; //上下左右4个方向
int Min;
int x,y,x2,y2;
void dfs(int i,int j,int sum)
{
int k;
if (i==x2&&j==y2)
{
if (sum<Min)
Min = sum;
return;
}
for (k=0; k<4; k++)
{
int x1 = i+cx[k][0];
int y1 = j+cx[k][1];
if (a[x1][y1]==0)
{
a[x1][y1]=1;
dfs(x1,y1,sum+1);
a[x1][y1]=0;
}
}
}
int main()
{
int n;
scanf("%d",&n);
for (int i=0; i<n; i++)
{
Min=999;
scanf("%d%d%d%d",&x, &y, &x2, &y2);
a[x][y]=1;
dfs(x,y,0);
a[x][y]=0;
cout<<Min<<endl;
}
return 0;
}