最少步数
时间限制:
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,10表示道路,1表示墙。
现在输入一个道路的坐标作为起点,再如输入一个道路的坐标作为终点,问最少走几步才能从起点到达终点?
(注:一步是指从一坐标点走到其上下左右相邻坐标点,如:从(3,1)到(4,1)。)
bfs!模板并没有完全记住,写到一半就开始看模板了QAQ
以后要多做一些这样的题=A=……至少把模板记住了_(:з」∠)_
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
int x,b,c,d;
struct Note
{
int x,y,step;
bool friend operator<(Note a,Note b)
{
return a.step>b.step;
}
}a,temp;
int dis[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
int map[20][20]={{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 vis[20][20];
int bfs()
{
int i;
priority_queue<Note>qp;
a.x=x;a.y=b;a.step=0;
qp.push(a);
while(!qp.empty())
{
a=qp.top();
qp.pop();
if(a.x==c&&a.y==d)
return a.step;
for(i=0;i<4;i++)
{
temp.x=a.x+dis[i][0];
temp.y=a.y+dis[i][1];
if(!vis[temp.x][temp.y]&&!map[temp.x][temp.y]&&temp.x>=0&&temp.y>=0&&temp.x<8&&temp.y<8)
{
temp.step=a.step+1;
vis[temp.x][temp.y]=1;
qp.push(temp);
}
}
}
return -1;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
memset(vis,0,sizeof(vis));
scanf("%d%d%d%d",&x,&b,&c,&d);
int sum=bfs();
printf("%d\n",sum);
}
return 0;
}
2016.7.28
今天又学了一种dfs方法做这个题,不过相对bfs来说,这种方法时间复杂度应该很高。
最少步数类的还是能用bfs就用bfs吧……嗷,对了,要注意数组要开的刚好贴合这个给出的迷宫,不然这个判断方法会出事……
#include<stdio.h>
#include<string.h>
#define INF 0xfffffff
int map[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 dis[4][2]={{0,1},{1,0},{-1,0},{0,-1}};
int a,b,c,d,min;
void dfs(int x,int y,int step)
{
int i;
if(x==c&&y==d)
{
if(step<min)
min=step;
return;
}
for(i=0;i<4;i++)
{
int t_x=x+dis[i][0];
int t_y=y+dis[i][1];
if(map[t_x][t_y]==0&&step+1<min)
{
map[t_x][t_y]=1;
dfs(t_x,t_y,step+1);
map[t_x][t_y]=0;
}
}
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
min=INF;
scanf("%d%d%d%d",&a,&b,&c,&d);
map[a][b]=1;
dfs(a,b,0);
map[a][b]=0;
printf("%d\n",min);
}
return 0;
}