uva 657 - The die is cast
2012-07-08 01:23
381 查看
点击打开链接
题目意思:给定一个地图,然后里面分布着许多的骰子,如果骰子连在一起就是算1 ,要求给定的地图里面的骰子的点数,并且从小到大输出。
解题思路:我们知道,对于一个地图里面分布着许多的小块区域,而每一快区域里面我们要求对应骰子的点数,那么我们可以先写一个dfs函数来搜索每一个区域,然后在这个区域里面如果我们遇到'X'就在写一个Dfs用来求解骰子的点数,就是在dfs函数里面嵌套Dfs
代码:
题目意思:给定一个地图,然后里面分布着许多的骰子,如果骰子连在一起就是算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; }
相关文章推荐
- UVA 657 - The die is cast
- UVA 657 - The die is cast
- UVA 657 The die is cast ——bfs+dfs
- UVa 657 - The die is cast
- UVa 657 The die is cast
- uva 657 The die is cast
- uva657 The die is cast(搜索)
- UVa 657 & POJ 1481 - The die is cast
- UVA 657-The die is cast(双重BFS)
- UVA 657 - The die is cast 深度搜索
- uva 657 The die is cast(DFS遍历图)
- uva 657 - The die is cast
- UVa 657 - The die is cast
- The die is cast UVA 657
- UVA 657 The die is cast
- uva 657 The die is cast
- Uva 657 - The die is cast
- UVA 657 - The die is cast
- UVA 657-The die is cast(dfs*2)
- UVA - 657 The die is cast(二重dfs)