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;}
时间: 2024-10-11 12:34:18