uva 657 - The die is cast

  The die is cast 

InterGames is a high-tech startup company that specializes in developing technology that allows users to play games over the Internet. A market analysis has alerted them to the fact that games of chance are pretty popular among their potential customers. Be it Monopoly, ludo or backgammon, most of these games involve throwing dice at some stage of the game.

Of course, it would be unreasonable if players were allowed to throw their dice and then enter the result into the computer, since cheating would be way to easy. So, instead, InterGames has decided to supply their users with a camera that takes a picture of the thrown dice, analyzes the picture and then transmits the outcome of the throw automatically.

For this they desperately need a program that, given an image containing several dice, determines the numbers of dots on the dice.

We make the following assumptions about the input images. The images contain only three dif- ferent pixel values: for the background, the dice and the dots on the dice. We consider two pixels connected if they share an edge - meeting at a corner is not enough. In the figure, pixels A and B are connected, but B and C are not.

A set S of pixels is connected if for every pair (a,b) of pixels in S, there is a sequence in S such that a = a1 and b = ak , and ai and ai+1 are connected for .

We consider all maximally connected sets consisting solely of non-background pixels to be dice. `Maximally connected‘ means that you cannot add any other non-background pixels to the set without making it dis-connected. Likewise we consider every maximal connected set of dot pixels to form a dot.

Input

The input consists of pictures of several dice throws. Each picture description starts with a line containing two numbers w and h, the width and height of the picture, respectively. These values satisfy .

The following h lines contain w characters each. The characters can be: ``.‘‘ for a background pixel, ``*‘‘ for a pixel of a die, and ``X‘‘ for a pixel of a die‘s dot.

Dice may have different sizes and not be entirely square due to optical distortion. The picture will contain at least one die, and the numbers of dots per die is between 1 and 6, inclusive.

The input is terminated by a picture starting with w = h = 0, which should not be processed.

Output

For each throw of dice, first output its number. Then output the number of dots on the dice in the picture, sorted in increasing order.

Print a blank line after each test case.

Sample Input

30 15
..............................
..............................
...............*..............
...*****......****............
...*X***.....**X***...........
...*****....***X**............
...***X*.....****.............
...*****.......*..............
..............................
........***........******.....
.......**X****.....*X**X*.....
......*******......******.....
.....****X**.......*X**X*.....
........***........******.....
..............................
0 0

Sample Output

Throw 1
1 2 2 4
#include <iostream>
#include <stack>
#include <cstring>
#include <cstdio>
#include <string>
#include <algorithm>
#include <queue>
#include <set>
#include <map>
#include <fstream>
#include <stack>
#include <list>
#include <sstream>
#include <cmath>

using namespace std;

#define ms(arr, val) memset(arr, val, sizeof(arr))
#define mc(dest, src) memcpy(dest, src, sizeof(src))
#define N 55
#define INF 0x3fffffff
#define vint vector<int>
#define setint set<int>
#define mint map<int, int>
#define lint list<int>
#define sch stack<char>
#define qch queue<char>
#define sint stack<int>
#define qint queue<int>

int ans[2500], p;

char image[N][N];
int dir[4][2] = {0, -1, -1, 0, 1, 0, 0, 1};
//必须要两个dfs
void _dfs(int i, int j)
{
    if (image[i][j] == ‘X‘)
    {
        image[i][j] = ‘.‘;
        for (int k = 0; k < 4; k++)
        {
            _dfs(i + dir[k][0], j + dir[k][1]);
        }
    }
}

void dfs(int i, int j)
{
    if (image[i][j] != ‘.‘)
    {
        if (image[i][j] == ‘X‘)
        {
            _dfs(i, j);//寻找相邻的X
            ans[p]++;
        }
        else
            image[i][j] = ‘.‘;
        for (int k = 0; k < 4; k++)
        {
            dfs(i + dir[k][0], j + dir[k][1]);
        }
    }
}
int main()
{
    int w, h, cases = 1;
    ms(image[0], ‘.‘);
    while (scanf("%d%d", &w, &h), w && h)
    {
        for (int i = 1; i <= h; i++)
        {
            scanf("%s", image[i] + 1);
            image[i][0] = image[i][w + 1] = ‘.‘;
        }
        ms(image[h + 1], ‘.‘);//不能少
        ms(ans, 0);
        p = 0;
        for (int i = 1; i <= h; i++)
        {
            for (int j = 1; j <= w; j++)
            {
                if (image[i][j] != ‘.‘)
                {
                    dfs(i, j);
                    p++;
                }
            }
        }
        sort(ans, ans + p);
        printf("Throw %d\n", cases++);
        printf("%d", ans[0]);
        for (int i = 1; i < p; i++)
        {
            printf(" %d", ans[i]);
        }
        printf("\n\n");
    }
    return 0;
}

uva 657 - The die is cast

时间: 2024-08-25 07:26:00

uva 657 - The die is cast的相关文章

UVA 657-The die is cast(双重BFS)

InterGames is a high-tech startup company that specializes in developing technology that allows users to play games over the Internet. A market analysis has alerted them to the fact that games of chance are pretty popular among their potential custom

UVA 657-The die is cast(dfs*2)

The die is cast Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit Status Description InterGames is a high-tech startup company that specializes in developing technology that allows users to play games over the Internet. A

Uva657 - The die is cast

原题链接https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=598 这题就是在一堆*里找X,相邻的X算一个,所以我们可以两次dfs搜索,dfs2搜*有多少堆,dfs2搜一堆*里面有多少个不同的X,然后在按升序把每个堆里面的不同X输出来= = #include<stdio.h> #include<string.h> #in

UVa 657 掷色子

题意:就是有一张大图,每个像素即格子只可能是 . * X 三种,分别代表背景.色子.色子的点数.两个格子是相邻的或连通的,当且仅当两个格子是*或X,且有公共边,即上下左右四个方向,对角不算,即四连块.将一个连通块看做一个色子,将这个连通块中的X的连通块个数看做该色子的点数. 思路:两次深搜.第一次是由*和X来深搜每个连通块,在深搜每个连通块时由X来深搜X的连通块个数.这里可以通过两个标记数组visit来表示是否访问过,visitx来表示是否访问深搜X过.(也可以将X改为*.*改为.的方式实现,不

UVa 657 掷骰子

意甲冠军:有一个大图.每个像素是格孩子只可能是 . * X 三种.代表背景.玻色子.色子点. 两格子是邻近或在通信,当且仅当两个格儿子*要么X.且具有共同的边,这是上下左右四个方向,斜过,即四连块. 个色子.将这个连通块中的X的连通块个数看做该色子的点数. 思路:两次深搜.第一次是由*和X来深搜每一个连通块.在深搜每一个连通块时由X来深搜X的连通块个数.这里能够通过两个标记数组visit来表示是否訪问过,visitx来表示是否訪问深搜X过.(也能够将X改为*.*改为.的方式实现,不用标记数组.之

uva 657

很简单的题,就是题意不懂……! 就是判断每个'*'区域内‘X’区域块的个数 WA了好多次,就是太差了: 1.结果排序输出 2.因为是骰子所以不再1-6范围内的数字要舍弃 3.格式要求要空一行…… 4.因为碰到X就清零了,所以 XXX*XXXX*X.....X***XXX*** 把X清零之后,在原来的*区域内的dfs就进行不下去了,就wa了……233333333 代码: #include <iostream> #include <cstdio> #include <cmath&

UVA题目分类

题目 Volume 0. Getting Started 开始10055 - Hashmat the Brave Warrior 10071 - Back to High School Physics 10300 - Ecological Premium 458 - The Decoder 494 - Kindergarten Counting Game 414 - Machined Surfaces 490 - Rotating Sentences 445 - Marvelous Mazes

words2

餐具:coffee pot 咖啡壶coffee cup 咖啡杯paper towel 纸巾napkin 餐巾table cloth 桌布tea -pot 茶壶tea set 茶具tea tray 茶盘caddy 茶罐dish 碟plate 盘saucer 小碟子rice bowl 饭碗chopsticks 筷子soup spoon 汤匙knife 餐刀cup 杯子glass 玻璃杯mug 马克杯picnic lunch 便当fruit plate 水果盘toothpick 牙签中餐:bear's

我的英语提升计划----第二篇

01. Can you collect me from class tomorrow? 明天你能到学校来接我吗? 02. drag-and-drop 拖放   underlying data基础数据 03. profit(利润) margin利润率  out of box adj.现成的 04. leftmost最左边的  decouple解耦  restrospect 回顾 05. collectively总的来说 accidentally 意外地,不小心地 06. These items a