题目:校园迷宫

题目描述

总算期中考了,鄙人被教育局分配到了SY学校,当然是陪着很多人的。不知转了多少次车,总算到了。可惜的是,SY学校整个像个迷宫一样,就在门口贴了张学校地图。鄙人就开始研究地图了,但是学校错综复杂,等找到目的地,早就开考了。为此,鄙人取出随身携带的微型电脑(不知道从哪来的),向网上发去了求助书。注:只能往4个方向走:上、下、左、右。

输入格式

第1行,二个数,N,M。
接下来是一个N*M的矩阵,表示这个学校。(有N行,M列)。矩阵由2个数字组成。0:路;1:墙。路能走,墙不能走(这是基本常识。不过还是提醒一下,不然哪个牛又要飞檐走壁了)。
再是2行,第1行2个数X1,Y1表示校门口的坐标(即校门口在矩阵的第X1行,第Y1列)。第2行2个数X2,Y2表示鄙人的考场的坐标(即校门口在矩阵的第X2行,第Y2列)。
数据范围:0<M,N<=2000。0〈X1,X2〈=N,0〈Y1,Y2〈=M。

输出格式

一个数,表示最少要走的步数。如果走不到,则输出 No Answer!

 

 

题解:———————————————————————————————————————————————————

很多人一看到这道题,就像到了用BFS。

BFS代码实现:

#include<iostream>
using namespace std;

bool h[2001][2001]={0},g[2001][2001];int m,n,x,y,x1,y1;
int head=0,title=1;

int step[4][2]={{1,0},{0,1},{-1,0},{0,-1}};

struct quen{
       int l,r,d;
       }q[200001];

void bfs(){
     q[0].l=x;q[0].r=y;q[0].d=0;int i;
    
     while(head<title)
     {
      int x2,y2;
      for(i=0;i<=3;i++)
      {x2=q[head].l+step[i][0];
       y2=q[head].r+step[i][1];
       while(x2>=1&&x2<=n&&h[x2][y2]==0&&y2>=1&&y2<=m&&g[x2][y2]==0)
       {
        h[x2][y2]=1;
        if(x2==x1&&y2==y1) {cout<<q[head].d+1;return ;}
        q[title].l=x2;
        q[title].r=y2;
        q[title].d=q[head].d+1;
        title++;
                                                      }
      
      }head++;
                 
                      }
     cout<<"No Answer!"<<endl;return ;
    
     }

int main()
{
    int i,j;
    cin>>n>>m;
    for(i=1;i<=n;i++)
    for(j=1;j<=m;j++)
    cin>>g[i][j];
   
    cin>>x>>y>>x1>>y1;
   
    h[x][y]=1;
    bfs();
   
    return 0;
   
    }

 

然而这道题还有一个更高超的解法,用DFS!值得研究!

DFS代码实现:

#include<iostream>
#define Max 1000000
using namespace std;

int f[2001][2001]={0},x1,y1;bool v[2001][2001];

void dfs(int x,int y,int p){
     if(f[x][y]>p) f[x][y]=p;
     else return ;
     if(x==x1&&y==y1) return;
     if(v[x+1][y]==0) dfs(x+1,y,p+1);
     if(v[x][y+1]==0) dfs(x,y+1,p+1);
     if(v[x-1][y]==0) dfs(x-1,y,p+1);
     if(v[x][y-1]==0) dfs(x,y-1,p+1);
     }

int main()
{
    int n,m,x,y;int i,j;
    cin>>n>>m;
   
    for(i=1;i<=n;i++)
    for(j=1;j<=m;j++)
    {cin>>v[i][j];f[i][j]=Max;}
   
    cin>>x>>y>>x1>>y1;

    dfs(x,y,0);
   
    if(f[x1][y1]<Max)  {cout<<f[x1][y1]<<endl;return 0;}
    cout<<"No Answer"<<endl;return 0;
    }

posted on 2012-01-12 09:06  怡红公子  阅读(402)  评论(0编辑  收藏  举报