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 作者有过数次创业经历,最后一次在济南创业,后来公司搬到北京,看书中的交代公司目前好像还不算太成功.书中交代作者公司的业务是文化产品的策划,没细说做什么,也没说做成过哪 ...
随机推荐
- 谷歌三大核心技术(一)The Google File System中文版
谷歌三大核心技术(一)The Google File System中文版 The Google File System中文版 译者:alex 摘要 我们设计并实现了Google GFS文件系统,一个 ...
- 数据结构——链表(linkedlist)
基本分类: 1.单向链表 2.带尾指针的单向链表 3.双向循环链表 以下分类进行说明 1.单向链表 基本元素:*front //头节点 *next //下一节点 声明:node<T>*p; ...
- 二分法查找 --JS 实现
var indexOfSorted = function f(arr,n){ //assume : arr has been sorted var low = 0; var high = arr.le ...
- 《Java并发编程实战》第二章 线程安全性 读书笔记
一.什么是线程安全性 编写线程安全的代码 核心在于要对状态訪问操作进行管理. 共享,可变的状态的訪问 - 前者表示多个线程訪问, 后者声明周期内发生改变. 线程安全性 核心概念是正确性.某个类的行为与 ...
- Failed to load the JNI shared library
解决Eclipse无法打开"Failed to load the JNI shared library" 这是由于JDK配置错误所导致的现象. 一般说来,新购笔记本会预装64位的w ...
- 关于jdbc的一些疑问
1.为什么强调在使用jdbc时,须要在使用的时候才打开连接(Connection),用完后立刻关闭.假设我的连接(Connection)一開始就打开.在整个程序结束时才关闭,会带来什么后果呢? 2.为 ...
- 初步swift语言学习笔记2(可选类型?和隐式可选类型!)
作者:fengsh998 原文地址:http://blog.csdn.net/fengsh998/article/details/28904115 转载请注明出处 假设认为文章对你有所帮助.请通过留言 ...
- keytool 生成 Android SSL 使用的 BKS
我是在Mac(JDK 1.6) 环境下生成的,Windows 也应该通用; 首先要从CA那里申请来签名的证书,我的是crt格式的; 然后使用如下命令,对应的BcProvider 是 bcprov-e ...
- Codeforces 509C Sums of Digits 贪心
这道题目有人用DFS.有人用DP 我觉得还是最简单的贪心解决也是不错的选择. Ok,不废话了,这道题目的意思就是 原先存在一个严格递增的Arrary_A,然后Array_A[i] 的每位之和为Arra ...
- HDU2138 随机素数测试 Miller-Rabin算法
题目描述 Give you a lot of positive integers, just to find out how many prime numbers there are.. In eac ...