nyoj——58 最小步数(DFS,BFS 迷宫问题)

来源:互联网 发布:ambr软件 编辑:程序博客网 时间:2024/06/05 20:26

最少步数

时间限制: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)分别表示起点的行、列,终点的行、列。
输出
输出最少走几步。
样例输入
23 1  5 73 1  6 7
样例输出
1211
来源
[苗栋栋]原创
上传者

苗栋栋


一直都不会迷宫问题,今天刚听大神讲解了DFS和BFS,所以用两种方法来做这道题


BFS求解:

 #include <iostream>#include <cstring>#include <stack>#include <cstdio>#include <cmath>#include <queue>#include <algorithm>#include <vector>#include <set>#include <map>const double eps=1e-8;const double PI=acos(-1.0);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}};struct Node{    int x,y,step;}node;int ans=0;int n1,n2;int c[][2]={{0,1},{1,0},{0,-1},{-1,0}};void bfs(int i,int j){    int vis[9][9];    memset(vis,0,sizeof(vis));    queue<Node> q;    node.x=i;    node.y=j;    node.step=0;    vis[i][j]=1;    q.push(node);    while(!q.empty()){        Node temp,tp=q.front();        q.pop();        for(int k=0;k<4;k++){                temp.x=tp.x+c[k][0];                temp.y=tp.y+c[k][1];                if(temp.x<9&&temp.y<9&&temp.x>=0&&temp.y>=0&&vis[temp.x][temp.y]!=1&&a[temp.x][temp.y]!=1){                        temp.step=tp.step+1;                    q.push(temp);                    vis[temp.x][temp.y]=1;                    if(temp.x==n1&&temp.y==n2){                            ans=temp.step;                        return ;                    }                }        }    }}int main(){   /* for(int i=0;i<9;i++){        for(int j=0;j<9;j++)           cout<<a[i][j]<<" ";        cout<<endl;    }*/    int t;    scanf("%d",&t);    while(t--){        int a1,a2;        scanf("%d%d%d%d",&a1,&a2,&n1,&n2);        ans=0;        bfs(a1,a2);        printf("%d\n",ans);    }    return 0;}        


DFS求解:


#include <iostream>#include <cstring>#include <stack>#include <cstdio>#include <cmath>#include <queue>#include <algorithm>#include <vector>#include <set>#include <map>const double eps=1e-8;const double PI=acos(-1.0);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}};struct Node{    int x,y,step;}node;int ans=0;int n1,n2;int c[][2]={{0,1},{1,0},{0,-1},{-1,0}};int vis[9][9];void dfs(int i,int j,int cou){    if(i<0|j<0||i>8||j>8||vis[i][j]||a[i][j]||cou>ans)        return ;    if(i==n1&&j==n2){            ans=cou;        return ;    }    vis[i][j]=1;    dfs(i,j-1,cou+1);    dfs(i-1,j,cou+1);    dfs(i,j+1,cou+1);    dfs(i+1,j,cou+1);    vis[i][j]=0;}/*void bfs(int i,int j){    int vis[9][9];    memset(vis,0,sizeof(vis));    queue<Node> q;    node.x=i;    node.y=j;    node.step=0;    vis[i][j]=1;    q.push(node);    while(!q.empty()){        Node temp,tp=q.front();        q.pop();        for(int k=0;k<4;k++){                temp.x=tp.x+c[k][0];                temp.y=tp.y+c[k][1];                if(temp.x<9&&temp.y<9&&temp.x>=0&&temp.y>=0&&vis[temp.x][temp.y]!=1&&a[temp.x][temp.y]!=1){                        temp.step=tp.step+1;                    q.push(temp);                    vis[temp.x][temp.y]=1;                    if(temp.x==n1&&temp.y==n2){                            ans=temp.step;                        return ;                    }                }        }    }}*/int main(){   /* for(int i=0;i<9;i++){        for(int j=0;j<9;j++)           cout<<a[i][j]<<" ";        cout<<endl;    }*/    int t;    scanf("%d",&t);    while(t--){            memset(vis,0,sizeof(vis));        int a1,a2;        scanf("%d%d%d%d",&a1,&a2,&n1,&n2);        ans=999;        //bfs(a1,a2);        dfs(a1,a2,0);        printf("%d\n",ans);    }    return 0;}


原创粉丝点击