| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2612 人关注过本帖
标题:三色旗问题
只看楼主 加入收藏
ww84020209
Rank: 1
等 级:新手上路
帖 子:190
专家分:0
注 册:2006-8-21
收藏
得分:0 
以下是引用soft_wind在2006-8-31 22:47:49的发言:
#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,color[k]!='r',也就是说该元素已经判断是否是红色
k--;
while(j<=k)
{
if(color[j]=='r')
{
SWAP(color[j],color[k]);//上边的color[k]在此处与color[j]交换,也就是说 color[k]变成color[j],注意color[j]在下一次循环时,还是判断是否是红色。也就是说判断两次是否为红色。
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;
}
加个=号

对了,还有一个问题,还是
条件(3)对于每一个元素而言,测试它是红,是白,还是蓝的工作每种颜色最多只能做一次测试。


2006-08-31 23:05
ww84020209
Rank: 1
等 级:新手上路
帖 子:190
专家分:0
注 册:2006-8-21
收藏
得分:0 
当char color[]="wwrrrbr";时,跟踪一下程序,你会发现,那个b被与红色比较了三次。分别在下边的红色部分:
#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 23:19
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[]="wwrrrbr";
int i=0,j=0,k=strlen(color)-1;
while(color[j]=='b')
i++,j++;
while(color[k]=='r')
k--;
while(j<=k)
{
while(color[j]=='w')
j++;
if(j<=k&&color[j]=='b')
{
SWAP(color[j],color[i]);
i++,j++;
}
if(j<=k&&color[j]=='r')
{
SWAP(color[j],color[k]);k--;
while(color[k]=='r')
k--;
}

}
puts(color);
getch();
return 0;
}


对不礼貌的女生收钱......
2006-09-01 13:21
nuciewth
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:我爱龙龙
等 级:贵宾
威 望:104
帖 子:9786
专家分:208
注 册:2006-5-23
收藏
得分:0 
有点要划格子的味道,回去想想.

倚天照海花无数,流水高山心自知。
2006-09-01 13:48
ww84020209
Rank: 1
等 级:新手上路
帖 子:190
专家分:0
注 册:2006-8-21
收藏
得分:0 
以下是引用soft_wind在2006-9-1 13:21:22的发言:

您说得没错,呵呵.
再改成这样,您再看看:
#include "Stdio.h"
#include "Conio.h"
#define SWAP(x,y) { char temp; \
temp=x; \
x=y; \
y=temp; \
}
int main(void)
{
char color[]="wwrrrbr";
int i=0,j=0,k=strlen(color)-1;
while(color[j]=='b') //跳处循环时的j,color[j]!=‘b’,也就说与蓝色比较过了
i++,j++;
while(color[k]=='r')
k--;
while(j<=k)
{
while(color[j]=='w')
j++;
if(j<=k&&color[j]=='b') //如果上边的color[j]==‘r’,又要与蓝色比较一次
{
SWAP(color[j],color[i]);
i++,j++;
}
if(j<=k&&color[j]=='r')
{
SWAP(color[j],color[k]);k--;
while(color[k]=='r')
k--;
}

}
puts(color);
getch();
return 0;
}

还是有点问题!


2006-09-01 16:09
soft_wind
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:1430
专家分:0
注 册:2006-4-5
收藏
得分:0 
您说得没错,真要那样,还可以再加flag标记,把已经进行颜色比较的置flag[index]=1,未和index颜色比较的标记为flag[index]=0,即把颜色比较转换成标记是否为0的比较,这样就不存在您所说的那个问题了,
不过这样就没多大意思了,只会使效率降低还使空间开销加大。

对不礼貌的女生收钱......
2006-09-01 18:23
robin_008
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2006-8-24
收藏
得分:0 

有点难度

[此贴子已经被作者于2006-9-1 18:33:28编辑过]

2006-09-01 18:33
ww84020209
Rank: 1
等 级:新手上路
帖 子:190
专家分:0
注 册:2006-8-21
收藏
得分:0 

#include <string.h>
#define BLUE 'b'
#define WHITE 'w'
#define RED 'r'
#define SWAP(x, y) {char temp; \
temp = color[x]; \
color[x] = color[y]; \
color[y] = temp; \
}

void dutch_flag(char color[])
{
int white = 0;
int blue = 0;
int red = strlen(color) - 1;

while (white <= red)
if (color[white] == WHITE)
white++;
else if (color[white] == BLUE) {
SWAP(blue, white);
blue++, white++;
}
else {
while (white < red && color[red] == RED)
red--;
SWAP(red, white);
red--;
}
}

#include <stdio.h>
#define MAXSIZE 100
int main(void)
{
char flag[MAXSIZE];
printf("\n\nInput a String of Color Tokens (b, w and r)\n");
gets(flag);
dutch_flag(flag);
printf("\nRearranged Flag is :");
printf("\n%s\n", flag);
return 0;
}


2006-09-01 18:35
soft_wind
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:1430
专家分:0
注 册:2006-4-5
收藏
得分:0 
惭愧...
这样整合确实要好得多...

对不礼貌的女生收钱......
2006-09-01 18:44
快速回复:三色旗问题
数据加载中...
 
   



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

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