nyoj-58 最少步数

来源:互联网 发布:投资软件靠谱吗 编辑:程序博客网 时间:2024/05/18 00:13

最少步数

时间限制: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;}