zoukankan      html  css  js  c++  java
  • nyist 58 最小步数 BFS

    最少步数
    时间限制: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
    

      

    ///Memory Limit Exceeded
    
    
    #include <iostream> 
    #include <queue> 
    using namespace std; 
    struct node {   int x, y,step;  }; 
    struct node s,e; 
    int dd[4][2]={-1,0,1,0,0,-1,0,1},n,ans; 
    int g[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 
    }; 
    queue <node> q; 
    
     
    void bfs() 
    {   node t,t2; 
        
    while (! q.empty() )  q.pop(); 
       
    q.push(s); 
        
    while ( !q.empty()) 
        
    {   t=q.front(); 
            
    q.pop(); 
            
    if (t.x==e.x && t.y==e.y) {  ans=t.step; return ;   }         
    for (int i=0; i<4; i++)         
    {   t2.x=t.x+dd[i][0]; t2.y=t.y+dd[i][1]; t2.step=t.step+1; 
                
    if ( g[t2.x][t2.y]==0 ) q.push(t2);         
    }    
    } 
    } 
     
     
    int main(int argc, char *argv[]) 
    { 
        
    cin>>n;     
    while (n--)     
    {   cin>>s.x>>s.y>>e.x>>e.y; s.step=0;         
    ans=0;          
    bfs();        
    cout<<ans<<endl;     
    }    
    return 0; 
    }
    
    *******************************************************************************************************
    
    //ACCept
    
    
    #include <iostream>
    #include <queue>
    #define N 9
    #define M 9
    using namespace std;
    
    int map[N][M]=
    {
        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 d[4][2]={-1,0,0,1,1,0,0,-1 };
    
    struct point
    {
        int x,y,step;
    }s,e;
    
    queue <point> my;
    
    int BFS(point s)
    {
        int i,x,y;
        point t,temp;
        while (!my.empty()) my.pop();
        my.push(s);
        while (!my.empty())
        {
            t=my.front();
            my.pop();
            for (i=0; i<4; i++)
            {
                x=t.x+d[i][0];
                y=t.y+d[i][1];
                if (x==e.x&& y==e.y) return t.step+1;
                if (x>=0 && x<N && y>=0 && y<M && map[x][y]==0)
                {
                    temp.x=x;
                    temp.y=y;
                    temp.step=t.step+1;
                    my.push(temp);
                }
            }
        }
    }
    
    int main()
    {
        int n,x0,y0,ans;
        cin>>n;
        while (n--)
        {
            cin>>s.x>>s.y>>e.x>>e.y;
            s.step=0;
            if (s.x==e.x && s.y==e.y) ans=0;
            else ans=BFS(s);
            cout<<ans<<endl;
        }
        return 0;
    }
    
    
    
    
    
    
    
    
    
    *************************************************************
    
    Accept
    
    
    
    
    
    
    #include <cstring>
    #include <iostream>
    #include <queue>
    using namespace std;
    int ans;
    int g[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 dd[4][2]={-1,0,0,1,1,0,0,-1 };
    int bz[10][10];
    struct node{    int x,y,step;};
    struct node s,e;
    queue <node> q;
    
    int bfs( )
    {
        int i,x,y;
        node t,t2;
        q.push(s); bz[s.x][s.y]=1;
        while (!q.empty())
        {
            t=q.front();
            q.pop();
            if (t.x==e.x && t.y==e.y)  return t.step; 
            for (i=0; i<4; i++)
            {
                x=t.x+dd[i][0];
                y=t.y+dd[i][1];            
                if (g[x][y]==0&&!bz[x][y])
    			{   t2.x=x;    t2.y=y;     t2.step=t.step+1;
    				bz[x][y]=1;
                    q.push(t2);
                }
            }
        }
    }
    
    int main()
    {
        int n;
        cin>>n;
        while (n--)
        {   while (!q.empty()) q.pop();
        	memset(bz,0,sizeof(bz));
            cin>>s.x>>s.y>>e.x>>e.y;  s.step=0;
            cout<<bfs( )<<endl;
        }
        return 0;
    }
    

      

  • 相关阅读:
    为什么Go没有三元运算符
    [Win10]鼠标没用,插入USB口电脑提示USB Optical Mouse找不到驱动程序的解决方案
    Office2016软件安装教程
    office2019软件安装教程
    Go语言 科学计算库 Gonum 学习1
    AI Studio 学习 Go 豆瓣电影爬取
    Git下载、安装与环境配置
    VueJS 数组哪些方法是响应式的
    VueJS v-for
    VueJS v-show
  • 原文地址:https://www.cnblogs.com/wc1903036673/p/3458580.html
Copyright © 2011-2022 走看看