UVa 657 掷骰子
意甲冠军:有一个大图。每个像素是格孩子只可能是 . * X 三种。代表背景、玻色子、色子点。
两格子是邻近或在通信,当且仅当两个格儿子*要么X。且具有共同的边,这是上下左右四个方向,斜过,即四连块。
个色子。将这个连通块中的X的连通块个数看做该色子的点数。
思路:两次深搜。第一次是由*和X来深搜每一个连通块。在深搜每一个连通块时由X来深搜X的连通块个数。这里能够通过两个标记数组visit来表示是否訪问过,visitx来表示是否訪问深搜X过。(也能够将X改为*、*改为.的方式实现,不用标记数组。之前我想的是用一个标记数组,然后对其值的推断来实现,不如两个标记数组来得简便和直观)
注意:在主函数的两个for循环进行深搜前。注意推断是否已訪问过,否则产生大量点数为0的色子。另外,由于这个循环每次成功去深搜都是深搜了一个大的连通块,所以色子个数的添加应该在这个循环里,不要放在dfs里~
(之前的思路是。深搜一次。*在深搜时遇到X则点数加1,X深搜时遇到X则点数不加。
发现对2行2列的数据*XXX就会出错。由于这样算一个,那个思路算出来的是两个。
之后看了网上的思路,參考了一下。两次深搜,学习了~)
这里的深搜都是标记其被訪问过,每次深搜都是标记完一个连通块。
然后统计了訪问的次数,即连通块的个数:色子数、色子的点数。(包含之前油田那题的深搜也是这样。)
inclusive 包括的,exclusive才是排他的~
这里通过用字符 . 来初始化图G,并从1而不是0開始,即在图外围围了一圈字符 . ,这样就可避免推断坐标是否出界。(加一圈外围的停止字符,避免推断坐标是否出界)
Code:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define MAXN 55 int cmp_int(const void *_a, const void *_b);
void dfs(int hs,int ls);
void dfsx(int hs,int ls); int w,h;
char G[MAXN][MAXN];
int visit[MAXN][MAXN];
int visitx[MAXN][MAXN];
int dir[][4]={{-1,1,0,0},{0,0,1,-1}};//LRDU。前x后y,前水平后竖直
int num[MAXN*MAXN];//对应色子的点数
int cnt;//色子个数 int main()
{
//freopen("657.in","r",stdin);
//freopen("657.out","w",stdout);
int thrw=1;
while(scanf("%d%d",&w,&h) && w && h)
{
memset(G,'.',sizeof(G));
memset(visit,0,sizeof(visit));
memset(visitx,0,sizeof(visitx));
for(int i=1;i<=h;++i)
{
getchar();
for(int j=1;j<=w;++j)
{
G[i][j]=getchar();
}
}
cnt=0;
memset(num,0,sizeof(num));
for(int i=1;i<=h;++i)
for(int j=1;j<=w;++j)
if(G[i][j]!='.' && !visit[i][j])//注意这里的!visit条件。不然会打出非常多点数为0的色子
{
dfs(i,j);
cnt++;//色子数添加 //注意这个别放在dfs语句中了,想一想就理解了
//printf("%d %d\n",i,j);
}
qsort(num,cnt,sizeof(num[0]),cmp_int);
printf("Throw %d\n",thrw++);
for(int i=0;i<cnt;++i)
if(i==0) printf("%d",num[i]);
else printf(" %d",num[i]);
printf("\n\n");
}
return 0;
} int cmp_int(const void *_a, const void *_b)
{
return *(int*)_a-*(int*)_b;
} void dfsx(int hs,int ls)
{//由X来遍历连通块
if(G[hs][ls]!='X' || visitx[hs][ls]) return ;
visitx[hs][ls]=1;
for(int i=0;i<4;++i)
{
int nh=hs+dir[1][i];
int nl=ls+dir[0][i];
dfsx(nh,nl);
}
} void dfs(int hs,int ls)
{//从一点出发,由*和X来遍历连通块
if(G[hs][ls]=='.' || visit[hs][ls]) return ;
visit[hs][ls]=1;
if(G[hs][ls]=='X' && !visitx[hs][ls])
{
dfsx(hs,ls);
num[cnt]++;//点数添加
}
//else if(G[hs][ls]=='*') //注意这里别加这个推断条件。由于就算是字符X也须要进行以下这个循环的遍历
for(int i=0;i<4;++i)
{
int nh=hs+dir[1][i];
int nl=ls+dir[0][i];
dfs(nh,nl);
}
}
版权声明:本文博客原创文章,博客,未经同意,不得转载。
UVa 657 掷骰子的更多相关文章
- 掷骰子-IOS新手项目练习(抱歉,由于个人原因,图片没显示,要源码的项目私聊)
---恢复内容开始--- 今天我们来讲的就是项目<掷骰子> 首先我们先下载资源包,也就是我们需要的图片[点击图片下载] 在我们下载完图片之后,我们就可以开始创建项目 一.我们项目的做法可以 ...
- html5掷骰子的小demo
代码如下: <!DOCTYPE> <html> <title>柯乐义</title> <head> <script> var l ...
- jQuery掷骰子
网上找的jQuery掷骰子效果,测试兼容IE7及以上浏览器,IE6没有测试 js代码如下: $(function(){ var dice = $("#dice"); dice.cl ...
- TurnipBit开发板掷骰子小游戏DIY教程实例
转载请以链接形式注明文章来源(MicroPythonQQ技术交流群:157816561,公众号:MicroPython玩家汇) 0x00前言 下面带大家用TurnipBit开发板实现一个简单的小游戏- ...
- 掷骰子DApp的实现
前言: DApp前些日子比较火, 这段时间有些低迷. 我也是后知后觉, 现在才接触一些, 这篇博文就当做DApp的初次印象吧. 本文要写的是基于智能合约的博彩游戏DApp—骰子游戏, 来看看它是怎 ...
- python-模拟掷骰子,两个筛子数据可视化
""" 作者:zxj 功能:模拟掷骰子,两个筛子数据可视化 版本:3.0 日期:19/3/24 """ import random impo ...
- 纯php实现中秋博饼游戏(2):掷骰子并输出结果
这篇是纯php实现中秋博饼游戏系列博文(2) 上文是:纯php实现中秋博饼游戏(1):绘制骰子图案 http://www.cnblogs.com/zqifa/p/php-dice-1.html要纯ph ...
- 掷骰子游戏窗体实现--Java初级小项目
掷骰子 **多线程&&观察者模式 题目要求:<掷骰子>窗体小游戏,在该游戏中,玩家初始拥有1000的金钱,每次输入押大还是押小,以及下注金额,随机3个骰子的点数,如果3个骰 ...
- 3星|《给你讲个笑话:我是创业公司CEO》:创业成功就是上帝掷骰子
给你讲个笑话:我是创业公司CEO 作者有过数次创业经历,最后一次在济南创业,后来公司搬到北京,看书中的交代公司目前好像还不算太成功.书中交代作者公司的业务是文化产品的策划,没细说做什么,也没说做成过哪 ...
随机推荐
- Error Unable to start the Genymotion virtual device.解决
The Genymotion virtual device could not obtain an IP address.For an unknown reason.VirtualBox DHCP h ...
- 禁用 Windows Azure 网站中的 ARR 实例关联
编辑人员注释: 本博客文章由 Windows Azure 网站团队的项目经理 Erez Benari 撰写. 在 Windows Azure 网站中设置网站的多个实例是横向扩展网站的绝佳方式,Azur ...
- android -- 蓝牙 bluetooth (二) 打开蓝牙
4.2的蓝牙打开流程这一部分还是有些变化的,从界面上看蓝牙开关就是设置settings里那个switch开关,widget开关当然也可以,起点不同而已,后续的流程是一样的.先来看systemServe ...
- C#中的DataTable简单使用Merge
//不同结构的DataTable追加第二个DataTable数据在对应行后的 简单使用//不同结构的DataTable追加在行后面的合并 DataTable dt = new DataTable(); ...
- 数据结构C语言版 表插入排序 静态表
数据结构C语言版 表插入排序.txt两个人吵架,先说对不起的人,并不是认输了,并不是原谅了.他只是比对方更珍惜这份感情./* 数据结构C语言版 表插入排序 算法10.3 P267-P270 编译 ...
- javascript 入门之简单换肤效果
大家好,我是小强老师,这里简单入门 做一个换肤效果 效果如图所示: 这个案例思路分为两部分: 获取元素对象. var pic1 = document.getElementById('pic1'); v ...
- uva 10271 Chopsticks(dp)
题目连接:10271 - Chopsticks 题目大意:给出m和n, 然后给出n根筷子从小到大给出, 现在要从这n根筷子中选出m + 8组筷子, 每组筷子包括三根, 现在要求所有m + 8组每组筷子 ...
- POJ 3261 Milk Patterns(后缀数组+二分答案+离散化)
题意:给定一个字符串,求至少出现k 次的最长重复子串,这k 个子串可以重叠. 分析:经典的后缀数组求解题:先二分答案,然后将后缀分成若干组.这里要判断的是有没有一个组的符合要求的后缀个数(height ...
- Android 属性动画 源码解析 深入了解其内部实现
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/42056859,本文出自:[张鸿洋的博客] 我参加了博客之星评选,如果你喜欢我的博 ...
- HDU 3033 分组背包
给出N个物品.M金钱.W种类 给出N个物品的性质:所属种类,花费.价值 求每一种类物品至少一个的前提下,所能购买到的最大价值 dp[i][k]表示在第i种物品.总花费为k的最大价值 dp[i][k]= ...