Time Limit: 1000MS | Memory Limit: 10000KB | 64bit IO Format: %I64d & %I64u |
[Submit] [Go Back] [Status]
Description
Input
Output
Sample Input
30 15 .............................. .............................. ...............*.............. ...*****......****............ ...*X***.....**X***........... ...*****....***X**............ ...***X*.....****............. ...*****.......*.............. .............................. ........***........******..... .......**X****.....*X**X*..... ......*******......******..... .....****X**.......*X**X*..... ........***........******..... .............................. 0 0
Sample Output
Throw 1 1 2 2 4
题意:
给你一张二维平面图,叫你算出每个色子的点数有多少,并按照升序排序。
注意:
每个色子的面和点数,都只算上下左右连接的面,斜向不算。
输出时注意要留一个空行。
解析:
用一个vector来保存cnt的值
在新建一个标记数组visit[[N][N]
先for循环一遍,如果遇到'*'就让visit[x][y] = 0,并向周围四个方向搜索,如果遇到'X'就cnt++,然后用第二个dfs搜索'X'周围是否出现'X',如果有就将visit[x][y] = 0
如果cnt > 0 就将 cnt保存在vector中。
最后排序vector,并输出。
#include <iostream> #include <stdio.h> #include <vector> #include <algorithm> #include <string.h> using namespace std; int w,h; const int N = 60; char grid[N][N]; char visit[N][N]; void dfs1(int x,int y) { //将X周围的所有X都标记为已经访问过 if(x - 1 >= 0 && grid[x-1][y] == 'X' && visit[x-1][y] == 0) { visit[x-1][y] = 1; dfs1(x-1,y); } if(x + 1 < h && grid[x+1][y] == 'X' && visit[x+1][y] == 0) { visit[x+1][y] = 1; dfs1(x+1,y); } if(y - 1 >= 0 && grid[x][y-1] == 'X' && visit[x][y-1] == 0) { visit[x][y-1] = 1; dfs1(x,y-1); } if(y + 1 < w && grid[x][y+1] == 'X' && visit[x][y+1] == 0) { visit[x][y+1] = 1; dfs1(x,y+1); } } void dfs(int x,int y,int &cnt) { if(x < 0 || x >= h || y < 0 || y >= w) { //越界 return ; } if(grid[x][y] == '*' && visit[x][y] == 0) { visit[x][y] = 1; dfs(x+1,y,cnt); dfs(x-1,y,cnt); dfs(x,y+1,cnt); dfs(x,y-1,cnt); } else if(grid[x][y] == 'X' && visit[x][y] == 0) { visit[x][y] = 1; cnt++; dfs1(x,y); dfs(x+1,y,cnt); dfs(x-1,y,cnt); dfs(x,y+1,cnt); dfs(x,y-1,cnt); } } int main() { int cas = 1; while(scanf("%d%d",&w,&h) != EOF && (w || h)) { vector<int> dice; //初始化 memset(grid,0,sizeof(grid)); memset(visit,0,sizeof(visit)); for(int i = 0; i < h; i++) { scanf("%s",&grid[i]); } //查找 int cnt = 0; for(int i = 0; i < h; i++) { for(int j = 0; j < w; j++) { dfs(i,j,cnt); if(cnt != 0) { dice.push_back(cnt); cnt = 0; } } } sort(dice.begin(),dice.end()); printf("Throw %d\n",cas++); for(int i = 0;i < dice.size() - 1; i++) { printf("%d ",dice[i]); } printf("%d\n\n",dice.back()); } return 0; }