| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2612 人关注过本帖
标题:三色旗问题
只看楼主 加入收藏
robin_008
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2006-8-24
收藏
 问题点数:0 回复次数:18 
三色旗问题
三色旗问题:
假设有一个数组,它有n个元素,每一个不外乎是红,白,蓝3种颜色之一的代号,就用R,W,B代表。这些元素在数组中并没有依同样颜色的元素排在一起的方式来排列,请写一个程序把这些元素排成所有蓝色在前,接着是白色,最后是红色的排列方式,不过在写程序时要满足下面的条件:
(1)不能用额外的内存,换句话说,只能在数组之内用互换的方式完成。
(2)互换两个元素的动作要越少越好。
(3)对于每一个元素而言,测试它是红,是白,还是蓝的工作每种颜色最多只能做一次测试。
在这个条件下,请写一个最快的程序。
搜索更多相关主题的帖子: 三色旗问题 内存 元素 排列 颜色 
2006-08-30 21:17
soft_wind
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:1430
专家分:0
注 册:2006-4-5
收藏
得分:0 

这倒是个值得考虑的问题,有难度.
我有空再想想。


对不礼貌的女生收钱......
2006-08-30 21:59
soft_wind
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:1430
专家分:0
注 册:2006-4-5
收藏
得分:0 
#include "Stdio.h"
#include "Conio.h"
#define SWAP(x,y) { char temp; \
temp=x; \
x=y; \
y=temp; \
}
int main(void)
{
char color[]="wbrwbbrrwwrwbrrwww";
int i=0,j=0,k=strlen(color)-1;
while(color[j]=='b')
i++,j++;
while(color[k]=='r')
k--;
while(j<k)
{
if(color[j]=='r')
{
SWAP(color[j],color[k]);k--;
while(color[k]=='r')
k--;
}
while(color[j]=='w')
j++;
if(color[j]=='b')
{
SWAP(color[j],color[i]);
i++,j++;
}
}
puts(color);
getch();
return 0;
}
这个应该算符合要求,但不知道是不是最简的,

[此贴子已经被作者于2006-8-31 22:20:13编辑过]


对不礼貌的女生收钱......
2006-08-31 09:10
ww84020209
Rank: 1
等 级:新手上路
帖 子:190
专家分:0
注 册:2006-8-21
收藏
得分:0 
以下是引用soft_wind在2006-8-31 9:10:37的发言:
#include "Stdio.h"
#include "Conio.h"
#define SWAP(x,y) {
char temp=x;\
x=y; \
y=temp;\
}
int main(void)
{
char color[]="wbrwbbrrwwrwbrrwww";
int i=0,j=0,k=strlen(color)-1;
while(color[j]=='b')
i++,j++;
while(color[k]=='r')
k--;
while(j<k)
{
if(color[j]=='r')
{
SWAP(color[j],color[k]);
while(color[k]=='r') //红色的j,k是同一个元素,被测试两次是否为红,有一次是没用
k--;
}
while(color[j]=='w')
j++;
if(color[j]=='b')
{
SWAP(color[j],color[i]);
i++,j++;
}
}
puts(color);
getch();
return 0;
}
这个应该算符合要求,但不知道是不是最简的,

有一个条件不符合!
那就是:
(3)对于每一个元素而言,测试它是红,是白,还是蓝的工作每种颜色最多只能做一次测试。


2006-08-31 21:54
soft_wind
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:1430
专家分:0
注 册:2006-4-5
收藏
得分:0 
引用
while(j<k)
{
if(color[j]=='r')
{
SWAP(color[j],color[k]); /*加个k--;就符合要求了*/
while(color[k]=='r') //红色的j,k是同一个元素,被测试两次是否为红,有一次是没用
k--;
}
那只是我为简化写法而写的,倒让您误会了,

对不礼貌的女生收钱......
2006-08-31 22:02
ww84020209
Rank: 1
等 级:新手上路
帖 子:190
专家分:0
注 册:2006-8-21
收藏
得分:0 
呵呵,写的不错,我再看看还有没有问题!

2006-08-31 22:09
soft_wind
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:1430
专家分:0
注 册:2006-4-5
收藏
得分:0 
那您再帮我看看,我把那个改了.呵呵,谢了。

[此贴子已经被作者于2006-8-31 22:20:42编辑过]



对不礼貌的女生收钱......
2006-08-31 22:15
ww84020209
Rank: 1
等 级:新手上路
帖 子:190
专家分:0
注 册:2006-8-21
收藏
得分:0 

找到一个:
当char color[]="brbrwrwbbrbwb";时答案不正确。


2006-08-31 22:26
soft_wind
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:1430
专家分:0
注 册:2006-4-5
收藏
得分:0 

恩,谢谢。寝室马上停电了,我得下了,晚上我再改改.呵呵。


对不礼貌的女生收钱......
2006-08-31 22:42
soft_wind
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:1430
专家分:0
注 册:2006-4-5
收藏
得分:0 
#include "Stdio.h"
#include "Conio.h"
#define SWAP(x,y) { char temp; \
temp=x; \
x=y; \
y=temp; \
}
int main(void)
{
char color[]="brbrwrwbbrbwb";
int i=0,j=0,k=strlen(color)-1;
while(color[j]=='b')
i++,j++;
while(color[k]=='r')
k--;
while(j<=k)
{
if(color[j]=='r')
{
SWAP(color[j],color[k]);k--;
while(color[k]=='r')
k--;
}
while(color[j]=='w')
j++;
if(color[j]=='b')
{
SWAP(color[j],color[i]);
i++,j++;
}
}
puts(color);
getch();
return 0;
}
加个=号

对不礼貌的女生收钱......
2006-08-31 22:47
快速回复:三色旗问题
数据加载中...
 
   



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

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