题目意思:给定一个地图,然后里面分布着许多的骰子,如果骰子连在一起就是算1 ,要求给定的地图里面的骰子的点数,并且从小到大输出。
解题思路:我们知道,对于一个地图里面分布着许多的小块区域,而每一快区域里面我们要求对应骰子的点数,那么我们可以先写一个dfs函数来搜索每一个区域,然后在这个区域里面如果我们遇到'X'就在写一个Dfs用来求解骰子的点数,就是在dfs函数里面嵌套Dfs
代码:
#include <iostream>
#include <queue>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAXN = 55;
char pic[MAXN][MAXN];//存储地图
int mark[MAXN][MAXN] , ans[1010] , markx[MAXN][MAXN];
//mark数组标记走过‘*’,markx标记走过‘X’;
int dir[4][2] = {{-1,0},{0,1},{1,0},{0,-1}};
int w , h , t;
//对于X的搜索查找(找骰子的点数)
void Dfs(int i , int j){
if(markx[i][j])
return;
for(int k = 0 ; k < 4 ; k++){
if(i+dir[k][0] < 0 || i+dir[k][0] >= h)
continue;
if(j+dir[k][1] < 0 || j+dir[k][1] >= w)
continue;
if(pic[i+dir[k][0]][j+dir[k][1]] == '*')
continue;
if(pic[i+dir[k][0]][j+dir[k][1]] == '.')
continue;
if(markx[i+dir[k][0]][j+dir[k][1]])
continue;
markx[i][j] = 1;
Dfs(i+dir[k][0] , j+dir[k][1]); //继续Dfs
}
markx[i][j] = 1;
}
//对于*的搜索查找
void dfs(int i , int j){
if(mark[i][j])
return;
for(int k = 0 ; k < 4 ; k++){
if(i+dir[k][0] < 0 || i+dir[k][0] >= h)
continue;
if(j+dir[k][1] < 0 || j+dir[k][1] >= w)
continue;
if(pic[i+dir[k][0]][j+dir[k][1]] == '.')
continue;
if(mark[i+dir[k][0]][j+dir[k][1]])
continue;
if(pic[i+dir[k][0]][j+dir[k][1]] == '*' || pic[i+dir[k][0]][j+dir[k][1]] == 'X'){//如果是这两个字符继续搜索
if(pic[i+dir[k][0]][j+dir[k][1]] == 'X' && markx[i+dir[k][0]][j+dir[k][1]] == 0){//对于‘X’则调用Dfs函数
ans[t]++;
Dfs(i+dir[k][0] , j+dir[k][1]);
}
mark[i][j] = 1;
dfs(i+dir[k][0] , j+dir[k][1]);
}
}
mark[i][j] = 1;
}
//输出函数
void output(){
sort(ans , ans+t);//排序,对于几块区域输出几个ans,只要排序t个即可
for(int i = 0 ; ans[i] != 0 ; i++){
if(ans[i+1])
cout<<ans[i]<<" ";
else
cout<<ans[i];
}
cout<<endl;
}
//处理问题函数
void solve(){
int i , j;
t = 0;
memset(mark , 0 , sizeof(mark));
memset(markx , 0 , sizeof(markx));
memset(ans , 0 , sizeof(ans));
for(i = 0 ; i < h ; i++){
for(j = 0 ; j < w ; j++){
if(pic[i][j] == '*' && mark[i][j] == 0){
dfs(i , j);
t++;//相应的区域个数加1
}
}
}
output();
}
//主函数
int main(){
int k = 1;
while(scanf("%d%*c%d%*c" , &w , &h) &&w &&h){
for(int i = 0 ; i < h ; i++){
for(int j = 0 ; j < w ; j++)
pic[i][j] = getchar();
getchar();//注意这里输入以后的换行要消去
}
printf("Throw %d\n" , k);
solve();
cout<<endl;
k++;
}
return 0;
}