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('\n')
 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;}

 

posted @ 2015-07-25 14:09  AI_Believer  阅读(246)  评论(0编辑  收藏  举报