• POJ 1979


    “.”能走,“#”不能走,“@”为起点,求所有能走到的地方。

    BFS:

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<queue>
     4 using namespace std;
     5 
     6 int w,h;
     7 int dir[4][2]={{0,+1},{-1,0},{0,-1},{+1,0}};
     8 char t[23][23];
     9 bool vis[23][23];
    10 struct type{
    11     int x,y;
    12 }st,now,next;
    13 
    14 int bfs()
    15 {
    16     int cnt=1;
    17     queue<type> q;
    18     q.push(st);
    19     while(!q.empty())
    20     {
    21         now=q.front();q.pop();
    22         for(int i=0;i<4;i++)  
    23         {  
    24             next.x=now.x+dir[i][0] , next.y=now.y+dir[i][1]; //尝试走一步 
    25             if(vis[next.x][next.y]==0) //如果这一步可以走 
    26             {
    27                 vis[next.x][next.y]=1; //将走过的这块tile标记为1
    28                 q.push(next); 
    29                 cnt++; //可走的tile计数+1 
    30             }
    31         }
    32     }
    33     return cnt;
    34 }
    35 
    36 int main()
    37 {
    38     while(scanf("%d%d",&w,&h) && (w*h)!=0)
    39     { 
    40         for(int i=1;i<=h;i++)
    41         {
    42             scanf("%s",(t[i]+1));
    43         }
    44         
    45         //将地图转化为相应的标记数组,所有不能走的、走过的tile均标记为1(包括边界以外的地方以及起点),能走的tile都标记为0
    46         memset(vis,1,sizeof(vis)); 
    47         for(int i=1;i<=h;i++)
    48         {
    49             for(int j=1;j<=w;j++)
    50             {
    51                 if(t[i][j]=='.') vis[i][j]=0;
    52                 if(t[i][j]=='#') vis[i][j]=1;
    53                 if(t[i][j]=='@') st.x=i,st.y=j,vis[i][j]=1;
    54             }
    55         }
    56         
    57         int ans=bfs();
    58         printf("%d
    ",ans);
    59     }
    60 }

     
    DFS:

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<queue>
     4 using namespace std;
     5 
     6 int w,h;
     7 int dir[4][2]={{0,+1},{-1,0},{0,-1},{+1,0}};
     8 char t[23][23];
     9 bool vis[23][23];
    10 struct type{
    11     int x,y;
    12 }st,next;
    13 
    14 void dfs(int x,int y,int &ans)
    15 {
    16     if(vis[x][y]) return; //如果这个tile走过直接退出函数
    17     vis[x][y]=1; //把这块tile标记为已走过
    18     ans++; //计数+1
    19     for(int i=0;i<4;i++)
    20     {
    21         next.x=x+dir[i][0] , next.y=y+dir[i][1]; //走一步
    22         if(next.x >= 1 && next.x <= h && next.y >= 1 && next.y <= w) //如果走的这一步tile在限定的 w * h 范围内就深搜一下
    23         {
    24             dfs(next.x,next.y,ans);
    25         }
    26     }
    27 }
    28 
    29 int main()
    30 {
    31     while(scanf("%d%d",&w,&h) && (w*h)!=0)
    32     { 
    33         for(int i=1;i<=h;i++)
    34         {
    35             scanf("%s",(t[i]+1));
    36         }
    37         
    38         for(int i=1;i<=h;i++)
    39         {
    40             for(int j=1;j<=w;j++)
    41             {
    42                 if(t[i][j]=='.') vis[i][j]=0;
    43                 if(t[i][j]=='#') vis[i][j]=1;
    44                 if(t[i][j]=='@') st.x=i,st.y=j,vis[i][j]=0;
    45             }
    46         }
    47         
    48         int ans=0;
    49         dfs(st.x,st.y,ans);
    50         printf("%d
    ",ans);
    51     }
    52 }


  • 相关阅读:
    Java学习笔记(三)——运算符
    [镜像]镜像操作losetup
    [DNS]部署局域网DNS服务器
    [3G/4G]3G/4G模块开发
    [4G]常用AT指令
    [ubuntu]E: The package firmware-upgrade needs to be reinstalled, but I can't find an archive for it.
    [mmc]Linux下MMC/SD/SDIO的识别与操作
    [MMC]Linux MMC/SD/SDIO驱动分析
    [mmc]设备树节点含义
    [uboot]What is MLO file?
  • 原文地址:https://www.cnblogs.com/dilthey/p/6804162.html
Copyright © 2020-2023  润新知