zoukankan      html  css  js  c++  java
  • COJN 0487 800301红与黑

    800301红与黑
    难度级别:B; 运行时间限制:1000ms; 运行空间限制:51200KB; 代码长度限制:2000000B
    试题描述
    有一间长方形的房子,地上铺了红色、黑色两种颜色的正方形瓷砖。你站在其中一块黑色的瓷砖上,只能向相邻的黑色瓷砖移动。请写一个程序,计算你总共能够到达多少块黑色的瓷砖。
    输入
    包括多个数据集合。每个数据集合的第一行是两个整数W和H,分别表示x方向和y方向瓷砖的数量。W和H都不超过20。在接下来的H行中,每行包括W个字符。每个字符表示一块瓷砖的颜色,规则如下
    1)‘.’:黑色的瓷砖;
    2)‘#’:白色的瓷砖;
    3)‘@’:黑色的瓷砖,并且你站在这块瓷砖上。该字符在每个数据集合中唯一出现一次。
    当在一行中读入的是两个零时,表示输入结束。
    输出
    对每个数据集合,分别输出一行,显示你从初始位置出发能到达的瓷砖数(记数时包括初始位置的瓷砖)。
    输入示例
    6 9 
    ....#. 
    .....# 
    ...... 
    ...... 
    ...... 
    ...... 
    ...... 
    #@...# 
    .#..#. 
    0 0
    输出示例
    45
    其他说明
     

    题解:搜索练习题,要注意ans,vis的清零。

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cmath>
     4 #include<algorithm>
     5 #include<queue>
     6 #include<cstring>
     7 #define PAU putchar(' ')
     8 #define ENT putchar('
    ')
     9 using namespace std;
    10 const int maxn=20+5;
    11 char A[maxn][maxn];bool vis[maxn][maxn];
    12 int mx[]={0,0,-1,1},my[]={-1,1,0,0};
    13 inline int read(){
    14     int x=0,sig=1;char ch=getchar();
    15     for(;!isdigit(ch);ch=getchar())if(ch=='-')sig=0;
    16     for(;isdigit(ch);ch=getchar())x=10*x+ch-'0';
    17     return sig?x:-x;
    18 }
    19 inline void write(int x){
    20     if(x==0){putchar('0');return;}if(x<0)putchar('-'),x=-x;
    21     int len=0,buf[15];while(x)buf[len++]=x%10,x/=10;
    22     for(int i=len-1;i>=0;i--)putchar(buf[i]+'0');return;
    23 }
    24 int n,m,sx,sy,ans;
    25 void find(){
    26     for(int i=0;i<n;i++){
    27         for(int j=0;j<m;j++){
    28             if(A[i][j]=='@'){A[i][j]='.';sx=i;sy=j;return;}
    29         }
    30     }return;
    31 }
    32 void dfs(int x,int y){
    33     if(x<0||x>=n||y<0||y>=m||vis[x][y]||A[x][y]!='.')return;ans++;vis[x][y]=true;
    34     for(int d=0;d<4;d++)dfs(x+mx[d],y+my[d]);return;
    35 }
    36 void init(){
    37     while(scanf("%d%d",&m,&n)==2){
    38         if(!m&&!n)return;
    39         memset(vis,false,sizeof(vis));ans=0;
    40         for(int i=0;i<n;i++)scanf("%s",A+i);
    41         find();dfs(sx,sy);write(ans);ENT;
    42     }
    43     return;
    44 }
    45 void work(){
    46     return;
    47 }
    48 void print(){
    49     return;
    50 }
    51 int main(){init();work();print();return 0;}
  • 相关阅读:
    jsp、js分页功能的简单总结
    jsp实现验证码
    JSP内置对象总结
    java集合类总结二
    工程一:记事本的实现
    学编程上这些网站就够了
    一位程序员和他的程序员老婆分手了,原因竟是…
    培训机构出来的程序员为何不受企业待见?
    在w3cschool学完html,css,javascript,jquery以后,还是不会做前端怎么办?
    我只是个写代码的(幽默一下)
  • 原文地址:https://www.cnblogs.com/chxer/p/4675835.html
Copyright © 2011-2022 走看看