nyoj-58 最少步數
阿新 • • 發佈:2019-02-16
最少步數
時間限制: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;
}