zoukankan      html  css  js  c++  java
  • (BFS)aoj0558-Cheese

    题目地址

      根据题意,必须按从1吃到n的顺序。建立vi数组记录去没去过某一点,从起点向四周搜索,合法且未去过就入队列。每当找到符合此时应吃的位置,就将这个位置改为'.'并刷新vi数组,清空队列(因为必须要这时从这点出发才能用时最短)再从这一点继续这个过程,直到遇到n位置且体力为n结束,输出步数。

      参考代码:

      

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<queue>
     4 #include <iostream>
     5 using namespace std;
     6 int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}},sj[1005][1005];
     7 char maze[1005][1005];
     8 bool vi[1005][1005];
     9 typedef pair<int ,int >P;
    10 int h,w,n,ti=1;
    11 int bfs(int oi,int oj)
    12 {
    13     queue<P> que;
    14     que.push(P(oi,oj));P p;
    15     while(que.size())
    16     {
    17         p=que.front();
    18         que.pop();
    19         if(maze[p.first][p.second]-'0'==n&&ti==n)
    20             return sj[p.first][p.second];
    21         if(maze[p.first][p.second]-'0'==ti)
    22         {
    23             memset(vi,false,sizeof(vi));
    24             vi[p.first][p.second]=true;
    25             while(que.size())
    26             {
    27                 que.pop();
    28             }
    29 
    30             maze[p.first][p.second]='.';
    31             ti++;
    32         }
    33         for(int i=0;i<4;i++)
    34         {
    35             int xx,yy;
    36             xx=p.first+dir[i][0];
    37             yy=p.second+dir[i][1];
    38             if(xx>=0&&xx<h&&yy>=0&&yy<w&&maze[xx][yy]!='X'&&vi[xx][yy]==false)
    39             {
    40                 vi[xx][yy]=true;
    41                 sj[xx][yy]=sj[p.first][p.second]+1;
    42                 que.push(P(xx,yy));
    43             }
    44         }
    45     }
    46 }
    47 int main()
    48 {
    49     memset(sj,0,sizeof(sj));
    50     memset(vi,false,sizeof(vi));
    51     scanf("%d%d%d",&h,&w,&n);
    52     int i,j,an;
    53     for(i=0;i<h;i++)
    54     {
    55         scanf("%s",maze[i]);
    56     }
    57     for(i=0;i<h;i++)
    58     {
    59         for(j=0;j<w;j++)
    60         {
    61             if(maze[i][j]=='S')
    62             {
    63                 vi[i][j]=true;
    64                 an=bfs(i,j);
    65                printf("%d
    ",an);return 0;
    66             }
    67         }
    68     }
    69 }
  • 相关阅读:
    增加路由的方法
    常见问题代码
    统计用
    json格式,但是不要unicode编码
    查看有没有安装ssh服务器端
    Unity3D写雷电游戏(二)
    MFC+Flash图片浏览器
    HGE做的俄罗斯方块
    原来C语言没有重载。。。
    随机生成路径
  • 原文地址:https://www.cnblogs.com/quintessence/p/6124000.html
Copyright © 2011-2022 走看看