| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4809 人关注过本帖
标题:求教各位一道题
只看楼主 加入收藏
jack10141
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:陕西西安
等 级:小飞侠
威 望:6
帖 子:706
专家分:2271
注 册:2010-8-10
收藏
得分:0 
以下是引用sunyh1999在2010-9-14 17:07:56的发言:

没看懂为什么放第一个的连通块是1
color数组存放染色结果 0表示未染色,n>0表示第n个连通区域,颜色编号为n,n从1开始
放第一个棋子,其上下左右均为无子区域或者边界,所以fooldfill只填一个格的颜色!
函数  int test_NUM_of_color()   中 /* */  注释掉的内容是输出当前棋盘与颜色表的代码,可以把其还原为正常代码,然后运行,看染色过程!

[ 本帖最后由 jack10141 于 2010-9-14 18:28 编辑 ]

Coding就像一盒巧克力,你永远不会知道你会遇到什么BUG
别跟我说你是不能的,这让我愤怒,因为这侮辱了你的智慧
2010-09-14 18:24
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
收藏
得分:0 
可是题目要求的是上下左右之一有一个相同颜色的棋子。第一个棋子不可能连通块,可是输入输出要求上写一个连通块,这是怎么回事呢?

欢迎来到我的博客:http://blog..cn/noisunyuhong
2010-09-14 18:29
jack10141
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:陕西西安
等 级:小飞侠
威 望:6
帖 子:706
专家分:2271
注 册:2010-8-10
收藏
得分:0 
以下是引用sunyh1999在2010-9-14 18:29:53的发言:

可是题目要求的是上下左右之一有一个相同颜色的棋子。第一个棋子不可能连通块,可是输入输出要求上写一个连通块,这是怎么回事呢?
程序代码:
    如下图是一个59的一块棋盘,其中“.”表示空格,“*”表示黑棋子,“@”表示白棋子。则有4块连通的棋子块。
       .........
       ..**..@..
       .**@@.@@.
       ..*@..*..
       .........

在这个图中,很显然右下角的“*”算一个连通块,所以,分析题意,孤立的一个棋子应该算一个连通块!
后面给的两组输入和输出,也应该这样理解!否则,题目本身就有问题了!

[ 本帖最后由 jack10141 于 2010-9-14 18:39 编辑 ]

Coding就像一盒巧克力,你永远不会知道你会遇到什么BUG
别跟我说你是不能的,这让我愤怒,因为这侮辱了你的智慧
2010-09-14 18:35
jack10141
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:陕西西安
等 级:小飞侠
威 望:6
帖 子:706
专家分:2271
注 册:2010-8-10
收藏
得分:0 
回复 12楼 sunyh1999
题目是你找来的,呵呵我只是认为应该这样理解。

如果一个孤立的棋子不算连通块的话,那么首先题目中就会有很多错误了!!
当然,问题也能解决,只要加一个变量,统计染色的面积就好!面积大于1才算连通块

-------------------------------------------

我刚才搜索了一下这个题目,其他版本里都有这样的要求:

    数据范围
    30%数据:l≤N≤10
    60%数据:l≤N≤100
    100%数据:l≤N≤500 l≤M≤N*N。

所以递归对于500*500全都是一种颜色的棋子这样的极端情况,搞不好会崩溃的!!

[ 本帖最后由 jack10141 于 2010-9-14 18:56 编辑 ]

Coding就像一盒巧克力,你永远不会知道你会遇到什么BUG
别跟我说你是不能的,这让我愤怒,因为这侮辱了你的智慧
2010-09-14 18:47
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
收藏
得分:0 
回复 14楼 jack10141
那么输出要求就不符合了。你能详细给我讲讲你的理解,也就是说你认为哪几个算连通块,写个示意图或是标出哪几个是连通块?


欢迎来到我的博客:http://blog..cn/noisunyuhong
2010-09-14 18:55
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
收藏
得分:0 
其实我的算法也是跟你一样的,先将棋子放入棋盘,然后枚举每一个棋子,将已经连通的棋子块在另一个数组里标记好,最后打印出count,就OK了

欢迎来到我的博客:http://blog..cn/noisunyuhong
2010-09-14 18:58
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
收藏
得分:0 
回复 14楼 jack10141
是的,用递归回溯做这道题确实不是很好,即使不奔溃也要超时,时间限制为1s。你可以用我现在正在写的框架试试:
程序代码:
#include <stdio.h>
#define MAXL 20//定义了block二维数组的最大值为20*20的矩阵
int blackcount=0,blackcounterd[MAXL][MAXL]={0};//blackcount为记录有几个连通块,blackcounter为标记
void search_pieces(int x[MAXL],int y[MAXL],int block[MAXL][MAXL],int pieces[MAXL],int m,int n)//查找连通块
{
    int i,j;
    for(i=0;i<n;i++)
    for(j=0;j<n;j++)

}
void put_pieces(int x[MAXL],int y[MAXL],int block[MAXL][MAXL],int pieces[MAXL],int m)//摆放棋子
{
    int i;
    for(i=0;i<m;i++)
    block[x[i]][y[i]]=pieces[i];//将棋子的值赋给棋盘
}
void main()
{
    int x[MAXL],y[MAXL],block[MAXL][MAXL],pieces[MAXL],i,j,n,m;//block为棋盘,i,j为循环用,x,y为坐标。
    scanf("%d %d",&n,&m);//n为用户定义数组的大小,m为共放了几个棋子
    for(i=0;i<n;i++)
    for(j=0;j<n;j++)
    block[i][j]=-1;//将棋盘全部赋给-1值,因为0是白棋,1是黑棋
    for(i=0;i<n;i++)
    scanf("%d %d %d %d",&pieces[i],&x[i],&y[i]);//输入棋子的颜色,坐标
    put_pieces(x,y,block,pieces,m);//将坐标,棋盘,颜色,基本信息,传入摆放棋子函数中
    search_pieces(x,y,block,pieces,m,n);//search_pieces为查找棋子有几个连通块
}


欢迎来到我的博客:http://blog..cn/noisunyuhong
2010-09-14 19:00
jack10141
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:陕西西安
等 级:小飞侠
威 望:6
帖 子:706
专家分:2271
注 册:2010-8-10
收藏
得分:0 
以下是引用sunyh1999在2010-9-14 18:55:35的发言:

那么输出要求就不符合了。你能详细给我讲讲你的理解,也就是说你认为哪几个算连通块,写个示意图或是标出哪几个是连通块?
所谓连通块就是棋子颜色一致、且相互连通的区域(孤立的一个棋子算是面积1的连通块),区域只允许相邻的格子上下左右紧挨连通,不允许斜向连通。。。。
不知道是否该这样理解!

Coding就像一盒巧克力,你永远不会知道你会遇到什么BUG
别跟我说你是不能的,这让我愤怒,因为这侮辱了你的智慧
2010-09-14 19:02
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
收藏
得分:0 
拿输入例子给画个示意图,指出一下连通块好吗?

欢迎来到我的博客:http://blog..cn/noisunyuhong
2010-09-14 19:03
jack10141
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:陕西西安
等 级:小飞侠
威 望:6
帖 子:706
专家分:2271
注 册:2010-8-10
收藏
得分:0 
以下是引用sunyh1999在2010-9-14 19:03:40的发言:

拿输入例子给画个示意图,指出一下连通块好吗?
       .........
       ..**..@..
       .**@@.@@.
       ..*@..*..
       .........
我用WORD表格做了这个图,彩色为4个连通块,这不难理解啊!
图片附件: 游客没有浏览图片的权限,请 登录注册

Coding就像一盒巧克力,你永远不会知道你会遇到什么BUG
别跟我说你是不能的,这让我愤怒,因为这侮辱了你的智慧
2010-09-14 19:17
快速回复:求教各位一道题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.015044 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved