Throw 11 2 2 4
题意:点是背景,星是骰子,x是骰子上的点,求背景上骰子有几个点。
注意:'x'先变'*', '*'在变'. ' ,还有最后空两行。横竖连在一起的视为一点,斜着连在一起不算一个。
还有最后要从小到大输出,要排序。
代码(困扰了好几天,8.19日下午听着歌放松着就给他解决了,好有感觉):
#include <stdio.h>#include <string.h>int d[4][2] = {{1,0},{-1,0},{0,1},{0,-1}};//4方向int n, m;int num[7];int i, j;int sum;char map[55][55];int vis[55][55];void bfs2(int x, int y)//一个或一片X变为*{ int i; map[x][y] = '*'; for (i = 0; i < 4; i ++) { if (map[x + d[i][0]][y + d[i][1]] == 'X') { bfs2(x + d[i][0], y + d[i][1]); } }}void bfs(int x, int y){ int i; map[x][y] = '.';//化为点 for (i = 0; i < 4; i ++) { if (map[x + d[i][0]][y + d[i][1]] == 'X') { bfs2(x + d[i][0], y + d[i][1]); sum ++; //一个骰子上有几个数点 } if (map[x + d[i][0]][y + d[i][1]] == '*') { bfs(x + d[i][0], y + d[i][1]); } }}int main(){ int tt = 1; while (scanf("%d%d", &m, &n) , n && m) { memset(map, 0 ,sizeof(map)); memset(num, 0 ,sizeof(num)); for (i = 1; i <= n; i ++) scanf("%s", &map[i]); for (i = 1; i <= n; i ++) for (j = 1; j <= m; j ++) if (map[i][j] == '*') //遇到骰子 { sum = 0; bfs(i, j); num[sum] ++; //哈希用法,sum不大于6 } printf("Throw %d\n", tt ++); int k=0; for (i = 1; i <= 6; i ++) while (num[i]--) {printf("%d ", i);k=1;} if(k==0) printf("0"); printf("\n\n"); } return 0;}