信息学奥赛一本通(1216:红与黑)
生活随笔
收集整理的這篇文章主要介紹了
信息学奥赛一本通(1216:红与黑)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1216:紅與黑
時間限制: 1000 ms ??? ??? 內存限制: 65536 KB
提交數: 17280 ??? 通過數: 6739
【題目描述】
有一間長方形的房子,地上鋪了紅色、黑色兩種顏色的正方形瓷磚。你站在其中一塊黑色的瓷磚上,只能向相鄰的黑色瓷磚移動。請寫一個程序,計算你總共能夠到達多少塊黑色的瓷磚。
【輸入】
包括多組數據。每組數據的第一行是兩個整數W和H,分別表示x方向和y方向瓷磚的數量。W和H都不超過20。在接下來的H行中,每行包括W個字符。每個字符表示一塊瓷磚的顏色,規則如下:
1)‘.’:黑色的瓷磚;
2)‘#’:白色的瓷磚;
3)‘@’:黑色的瓷磚,并且你站在這塊瓷磚上。該字符在每組數據中唯一出現一次。
當在一行中讀入的是兩個零時,表示輸入結束。
【輸出】
對每組數據,分別輸出一行,顯示你從初始位置出發能到達的瓷磚數(記數時包括初始位置的瓷磚)。
【輸入樣例】
6 9 ....#. .....# ...... ...... ...... ...... ...... #@...# .#..#. 0 0【輸出樣例】
45【分析】
? ? ? ? 下圖就是這道題的原型,灰色的也代表黑色,是人物站立的地方,所求的結果是黑色方塊連接的塊數一共是多少個?同水洼題目,如果用DFS求解,不用回溯。
【參考代碼】
#include <stdio.h> #include <string.h> #define N 1001int maps[N][N]; //瓷磚矩陣 int w,h; //瓷磚規模 int cnt; //統計瓷磚數int vis[N][N]; //訪問數組 int dir[4][2]={{0,1},{0,-1},{1,0},{-1,0}}; //方向數組void dfs(int x,int y) {int i,nx,ny;for(i=0;i<4;i++){nx=x+dir[i][0];ny=y+dir[i][1];if(nx>=1 && ny>=1 && nx<=h && ny<=w && vis[nx][ny]==0 && maps[nx][ny]==1){vis[nx][ny]=1;cnt++;dfs(nx,ny);//vis[nx][ny]=0; 本題同水洼題目,不用回溯,否則超時}} } int main() {int i,j,x,y;char ch;while(scanf("%d%d",&w,&h) && w || h){getchar();cnt=1;memset(vis,0,sizeof(vis));memset(maps,0,sizeof(maps));for(i=1;i<=h;i++){for(j=1;j<=w;j++){scanf("%c",&ch);if(ch=='@'){x=i;y=j;maps[i][j]=1;}if(ch=='.')maps[i][j]=1;if(ch=='#')maps[i][j]=0;}getchar();}vis[x][y]=1;dfs(x,y);printf("%d\n",cnt);}return 0; }http://ybt.ssoier.cn:8088/problem_show.php?pid=1216
?
總結
以上是生活随笔為你收集整理的信息学奥赛一本通(1216:红与黑)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 信息学奥赛一本通 1144:单词翻转 |
- 下一篇: 信息学奥赛一本通(1144:单词翻转)