红与黑(信息学奥赛一本通-T1216)
生活随笔
收集整理的這篇文章主要介紹了
红与黑(信息学奥赛一本通-T1216)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
【題目描述】
有一間長方形的房子,地上鋪了紅色、黑色兩種顏色的正方形瓷磚。你站在其中一塊黑色的瓷磚上,只能向相鄰的黑色瓷磚移動。請寫一個程序,計算你總共能夠到達多少塊黑色的瓷磚。
【輸入】
包括多個數據集合。每個數據集合的第一行是兩個整數W和H,分別表示x方向和y方向瓷磚的數量。W和H都不超過20。在接下來的H行中,每行包括W個字符。每個字符表示一塊瓷磚的顏色,規則如下:
1)‘.’:黑色的瓷磚;
2)‘#’:白色的瓷磚;
3)‘@’:黑色的瓷磚,并且你站在這塊瓷磚上。該字符在每個數據集合中唯一出現一次。
當在一行中讀入的是兩個零時,表示輸入結束。
【輸出】
對每個數據集合,分別輸出一行,顯示你從初始位置出發能到達的瓷磚數(記數時包括初始位置的瓷磚)。
【輸入樣例】
6 9?
....#.
.....#
......
......
......
......
......
#@...#
.#..#.
0 0
【輸出樣例】
45
【源程序】
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #define N 1001 using namespace std; int m,n; char ch; int maps[N][N]; int vis[N][N]; int dir[4][2]={{0,1},{0,-1},{1,0},{-1,0}}; int cnt; void dfs(int x,int y) {for(int i=0;i<4;i++){int nx=x+dir[i][0];int ny=y+dir[i][1];if(nx>=1&&ny>=1&&nx<=n&&ny<=m&&vis[nx][ny]==0&&maps[nx][ny]==1){vis[nx][ny]=1;cnt++;dfs(nx,ny);}} } int main() {while(scanf("%d%d",&m,&n)!=EOF&&m&&n){int x,y;cnt=1;memset(vis,0,sizeof(vis));memset(maps,0,sizeof(maps));for(int i=1;i<=n;i++)for(int j=1;j<=m;j++){cin>>ch;if(ch=='@'){x=i;y=j;maps[i][j]=1;}if(ch=='.')maps[i][j]=1;if(ch=='#')maps[i][j]=0;}vis[x][y]=1;dfs(x,y);cout<<cnt<<endl;}return 0; }?
新人創作打卡挑戰賽發博客就能抽獎!定制產品紅包拿不停!總結
以上是生活随笔為你收集整理的红与黑(信息学奥赛一本通-T1216)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 图论 —— 生成树 —— 最小树形图
- 下一篇: 暑期训练日志----2018.8.24