这题就是递归套用递归
先递归搜索骰子,如果在骰子里面发现了点,在对该点递归,同时更新点数。
代码如下:
#include<iostream>
#include <algorithm>
using namespace std;
char pic[60][200];
int visit[60][200];
int cnt[100];
int col, row;
//对骰子上的点递归
void dfs_dot(int x, int y) {
//只要pic[x][y] == x,就不会越界,因此不需要检查越界
if (visit[x][y]||pic[x][y]!='X')return;
visit[x][y] = 1;
dfs_dot(x + 1, y);
dfs_dot(x-1, y);
dfs_dot(x, y + 1);
dfs_dot(x, y - 1);
}
//对骰子递归
void DFS(int r, int c,int i) {
if (visit[r][c] || pic[r][c] == '.')return;
visit[r][c] = 1;
//如果在骰子上发现一个点,则这个骰子的点数+1,对该点递归
//要注意的是此时visit应该重置为0,因为对dfs_dot而言这个点之前没有visit过
if (pic[r][c] == 'X') { visit[r][c] = 0; cnt[i]++; dfs_dot(r, c); }
DFS(r + 1, c,i);
DFS(r - 1, c,i);
DFS(r, c + 1,i);
DFS(r, c - 1,i);
}
int main() {
FILE*stream;
freopen_s(&stream, "C:\\Data\\657.txt", "r", stdin);
scanf_s("%d %d", &col, &row);
int times = 01;
while (col&&row) {
char c = getchar();
for (int i = 0; i < row; i++)
gets_s(pic[i]);
memset(cnt, 0, sizeof(cnt));
memset(visit, 0, sizeof(visit));
int dice = 0;
for(int i =0;i<row;i++)
for (int j = 0; j < col; j++) {
if (!visit[i][j] && pic[i][j] == '*') {
DFS(i, j, dice);
dice++;
}
}
sort(cnt, cnt + dice);
cout << "Throw " << times << endl;
for (int i = 0; i < dice; i++)
cout << cnt[i] << ' ';
cout << endl;
scanf_s("%d %d", &col, &row);
times++;
}
return 0;
}