1. 程式人生 > >nyoj-58 最少步數

nyoj-58 最少步數

最少步數

時間限制: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;
}