问题描述
话说xgqin在考虑这个学期ACM课程考试试题的时候,小A同学在QQ上给xgqin留言,以下是两人的对话内容:
小A:老师 小A:明天考试要考察什么算法啊 xgqin:亲,你这个问题让我怎么回答? 小A:就是考试重点是什么 xgqin:sorry 没有终点 xgqin:重点 小A:深搜要考吗 xgqin:呵呵, 小A:懵逼表情 小A:透露一下呗 xgqin:
(PS: 学好语文很重要,以上两人对话中出现了多个错别字)
既然大家对深搜如此热爱,咱们就来一题呗。以下是你需要解决的问题:
在一个M×N的空间中,堆放着很多堆1×1×1的方块,方块的四周可以平铺其他方块,方块的上方也可以叠放其他方块(一块方块上方叠放的方块数不超过8块)。我们把平铺、叠放在一起的方块看成是一堆。你需要做的是找出在这M×N的空间中总共有多少堆方块以及最大的一堆方块包含的方块数。
输入
有多组测试样例。对每组测试样例:
第一行包含两个整型数M和N(1<= M, N<=100)。 接下来包含M行,每行包含N个字符,其中#号表示当前坐标下无方块,否则为1~9的数字字符C表示当前坐标下有C个方块叠放在一起。
输入M N 均为0时表示输入结束,0 0不作为输入样例。
输出
对每组测试样例,输出在M×N空间中,总共有多少堆方块,以及最大一堆方块包含的方块数。
输入范例
10 10 #1######## 121##2#### #3######## ###3333### ########## ##11111### ####1##### #####23### ####6#1### ########## 6 6 1####4 ##23## ###4## #9#5#9 ###6## 2####3 0 0
输出范例
4 18 7 20
超喜欢深搜的哈哈哈#include<stdio.h> #define MAX 100 int dir[8][2]={{-1,1},{-1,0},{-1,1},{0,-1},{0,1},{1,-1},{1,0},{1,1}}; int floor[101][101]; int count; int max; int number; int m; int n; void dfs(int x,int y) { if(floor[x][y]==0){ return ; } number=number+floor[x][y]; floor[x][y]=0; int i; for(i=0;i<8;i++){ if((x+dir[i][0]>0)&&(x+dir[i][0]<=m)&&(y+dir[i][1]>0)&&(y+dir[i][1]<=n)){ dfs(x+dir[i][0],y+dir[i][1]); } } } int main() { int i; int j; char c; do{ scanf("%d %d",&m,&n); if(m==0&&n==0){ break; } count=0; max=0; for(i=1;i<=m;i++){ getchar(); for(j=1;j<=n;j++){ scanf("%c",&c); if(c=='#'){ floor[i][j]=0; } else { floor[i][j]=c-'0'; } } } for(i=1;i<=m;i++){ for(j=1;j<=n;j++){ if(floor[i][j]>0){ number=0; dfs(i,j); count++; if(number>max){ max=number; } } } } printf("%d %d\n",count,max); }while(1); return 0; }