UVA 657 The die is cast
2015-07-31 15:57
232 查看
题目
掷色子分析
给一张低像素图啊,数色子点数,排序输出。色子不重合;
图中可能没有色子;
点数彼此不紧贴;
每组测试数据第一行依次读入的是列数和行数。
思路
遍历图,找到*即意味着找到了色子,
dfs把整个色子置为
.表示这个色子已经被搜索到,在
dfs过程中如果找到
X即意味这找到了点数,再
dfs把点数置为
*(因为一个点数可能不止一个
X符号表示)。
样例
INPUT/* 样例着实奇葩,但应该要通过 */
10 6
……….
.XXX……
….XXX…
…….XXX
….XXX…
*X*X……
6 6
XXXXX*
…..X
…..X
…..X
…..X
…..X
6 6
XXXXX.
…..X
…..X
…..X
…..X
…..X
6 6
XXXXX.
….*X
…..X
…..X
…..X
…..X
0 0
OUTPUT
Throw 1
1 1 1 1 2
Throw 2
2
Throw 3
1 1
Throw 4
2
代码
#include <cstdio> #include <cstring> #include <algorithm> #define N 55 using namespace std; int m, n, dot, b , d; int next[4][2] = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}}; char map ; void dfs_dot(int i, int j) { if (map[i][j] == 'X') { map[i][j] = '*'; for (int k = 0; k < 4; k++) dfs_dot(i+next[k][0], j+next[k][1]); } } void dfs_die(int i, int j) { if (map[i][j] == 'X') { dot++; dfs_dot(i, j); } if (map[i][j] == '*') { map[i][j] = '.'; for (int k = 0; k < 4; k++) dfs_die(i+next[k][0], j+next[k][1]); } } void solve() { d = 0; for (int i = 0; i < n; i++) for (int j = 0; j < m; j++) if (map[i][j] != '.') { dot = 0; dfs_die(i, j); b[d] = dot; d++; } sort(b, b+d); } int main() { for (int t = 1; ~scanf("%d%d", &m, &n), (m+n); t++) { memset(map, 0, sizeof(map)); for (int i = 0; i < n; i++) scanf("%s", map[i]); solve(); printf("Throw %d\n", t); for (int i = 0; i < d; i++) { printf("%d", b[i]); if (i != d-1) printf(" "); } printf("\n\n"); } return 0; }
相关文章推荐
- iOS 浏览器或应用中启动应用
- 设置EditText光标的位置
- 判别同位词算法
- SQL server 那些数据类型不能作为索引
- Javascript-动态操作分类信息2
- 将Python代码嵌入C++程序进行编写的实例
- BZOJ 1176: [Balkan2007]Mokia CDQ分治
- PAT (Advanced Level) 1094. The Largest Generation (25) 人数最多的一代,BFS
- 一位项目经理的一些个人体会
- HDOJ 5334 Virtual Participation
- Android Animation动画(很详细)
- std::thread and std::mutex
- java缓存(1、概述)
- inline函数的作用
- 设计模式 观察者模式
- Javascript高级程序设计读书笔记(第六章)
- 网站HTTP请求过程解析
- Android下最小化程序到后台代码
- 【转】Lua编程规范
- android知识杂记(三)