C语言三色旗问题(考试最后一道编程题)

时间:2008-06-04 18:30:09   来源:论坛整理  作者:  编辑:chinaitzhe
三色旗问题,一个字符串Color,其中每个元素值为‘R’‘W’‘B’三者之一,实现把数组中元素重新排列,所有蓝色在前,白色其后,红最后。
编写这么一个程序。
网上找到以下算法:

其實要實行這演算法抓住這幾個原則:
在 0 到 b - 1 之間放藍色,b 到 w - 1 放白色,r 1 到 n - 1 放紅色,而 w 到 r 之間元素未曾處理...
每一次都處理 w 所在元素,有三種情形:
1. 假如 w 所在位置是白色:那就把 w 加上 1
2. 假如 w 所在元素是藍色:把 b 與 w 所在元素對調,b、w 各加 1,維持上圖
3. 假如 w 所在元素是紅色:就把 w 和 r 元素互換,但是 r 減 1,w 不需減 1

看不太懂,这个程序应该怎么写,请高人指点
网友回复:写个循环数下R,W,B各有几个不就行了。。。然后重新生成个字符串
网友回复:题目不懂。
网友回复:
引用 2 楼 jennyvenus 的回复:
题目不懂。

我也是.么看懂题目.
网友回复:
引用 2 楼 jennyvenus 的回复:
题目不懂。

例如Color里面的是RWRRWBBRWBWR的话,程序运行后变为BBBWWWWRRRRR
网友回复:换来换去多麻烦,你的排列是死的,直接数个数
网友回复:简单点,排序!
网友回复:
引用 5 楼 babyvox1999 的回复:
换来换去多麻烦,你的排列是死的,直接数个数


up
网友回复:main()
{
int i,r,w,b;
r=0;w=0;b=0;
char c[20];
printf("Please input the color:\n");
scanf("%s",c);
for(i=0;i <20;i )
{
if(c[i]=='R')
r =1;
if(c[i]=='W')
w =1;
if(c[i]=='B')
b =1;
if(c[i]='\0')
break;
}
for(i=1;i <b;i )
printf("B");
for(i=1;i <w;i )
printf("W");
for(i=1;i <r;i )
printf("R")
}
网友回复:不赞成,上面这种做法,这样虽然是把这个题目做出来了,似乎打出来的是那么回事,但是没有做到这个题目想锻炼你的思维的地方。

这个题目要锻炼的是排序,和交换一个基本单位,。

排序虽然很简单,只是把一堆数字按大小重新排一遍,但是,排序的思想确是很重要的,因为现实中很多时候不是每个需要排序的单元都只是一个数字那么简单,往往是一个对象,或者一个结构。
网友回复:关注 接分
网友回复:#include "stdio.h"
#include "string.h"
#include "conio.h"
#define N 100

void main()
{
char color[N],temp;
int i,j;
printf("input color R or W or B:");
gets(color);

for(i=1;i <N;i )
{
for(j=N-1;j>=i;j--)
{
if(color[j]!='\0')
{
if(color[j-1]>color[j])
{
temp=color[j-1];
color[j-1]=color[j];
color[j]=temp;
}
}
}
}
for(i=0;i <N;i )
{
if(color[i]=='W')
{
color[i]='R';
continue;
}
if(color[i]=='R')
{
color[i]='W';
}
}
for(i=0;i <N;i )
{
if(color[i]=='B' ¦ ¦color[i]=='W' ¦ ¦color[i]=='R')
{
printf("%s",color[i]);
}
}
getch();
}

网友回复:
引用 8 楼 gzg25895381 的回复:
main()
{
int i,r,w,b;
r=0;w=0;b=0;
char c[20];
printf("Please input the color:\n");
scanf("%s",c);
for(i=0;i <20;i )
{
if(c[i]=='R')
r =1;
if(c[i]=='W')
w =1;
if(c[i]=='B')
b =1;
if(c[i]='\0')
break;
}
for(i=1;i <b;i )
printf("B");
for(i=1;i <w;i )
printf("W");
for(i=1;i <r;i )


这个就不错嘛
网友回复:我想
原题的意义在于不开辟新的内存空间
而在原空间上排序
不然没什么意义
网友回复:
引用 13 楼 afteryou_7 的回复:
我想
原题的意义在于不开辟新的内存空间
而在原空间上排序
不然没什么意义

同意楼上的意见,应该有以下的限制
寫時必須滿足下列限制:
1. 不用到額外 Memory,意思就是只能在陣列之內互換方式完成
2. 互換兩元素動作越少越好
3. 對每一元素而言,測試他是 R、W、B 的工作,每種顏色最多只能一次
网友回复: 我基础差了点

弄不懂意思
网友回复:three_color_flag
网友回复:我指挥用冒泡排序法^_^
网友回复:
引用 8 楼 gzg25895381 的回复:
main()
{
int i,r,w,b;
r=0;w=0;b=0;
char c[20];
printf("Please input the color:\n");
scanf("%s",c);
for(i=0;i <20;i )
{
if(c[i]=='R')
r =1;
if(c[i]=='W')
w =1;
if(c[i]=='B')
b =1;
if(c[i]='\0')
break;
}
for(i=1;i <b;i )
printf("B");
for(i=1;i <w;i )
printf("W");
for(i=1;i <r;i )
...假如理解正确的话,这样做无疑是最简单化了,很明了...

网友回复:char str[]="RWRRWBBRWBWR";
int len=strlen(str);
int i=0,j=0;
char t;
for(i=0;i <=len;i )
for(j=0;j <len-i;j )
{
if (str[j 1] == '\0')
continue;
if ((str[j] == 'R') && (str[j 1] != 'R'))
{
t=str[j];
str[j]=str[j 1];
str[j 1]=t;
continue;
}
else if ((str[j] == 'W') && (str[j 1] == 'B'))
{
t=str[j];
str[j]=str[j 1];
str[j 1]=t;
continue;
}
else if ((str[j] == 'B'))
continue;
else if (str[j] == str[j 1])
continue;
}

printf("%s\n",str);
return 0;[/code]
网友回复:
C/C code





Code highlighting produced by Actipro CodeHighlighter (freeware)

http://www.CodeHighlighter.com/





int dutch_flag(int color[], int n )

{

    int white = 0 ; 

    int blue = 0 ; 

    int red = n - 1 ;

    int t = 0 ;

    

    while(white <= red)                       /* is there are more token*/

    {

        if(color[white] == WHITE)             /* is a white */

            white    ;                           /* Yes just inc. white ptr */

        else if(color[white] == BLUE )        /* is a blue */

              {

               swap(color[blue],color[white]);  t  ; /* Yes ,swap the last w */

               blue   ;                              /* and the last b and inc. */

               white    ;

              }

        else                                        /* or is it a red ,skip */

        {

            while(white < red && color[red] == RED)  

                red --;                            /* red token and */ 

            swap(color[red],color[white]);   t   ;  /* swap with the last w */

            red -- ;                              /* dec red ptr */

        }

    }

    return t ;

}




网友回复:5楼的人真无聊,这道题是Dijkstra提出来的,要求就是不能用额外空间 以及交换次数最少

另补充一下
#define BLUE 3
#define WHITE 2
#define RED 1

int i , j , k ,n,t;
int a[10010];

void swap(int &a, int &b)
{
int temp ;
temp = a ;
a = b ;
b = temp;
}
关键字:语言,三色,问题,考试,最后,
上一篇:指针!

文章评论

共有 0 位网友发表了评论 此处只显示部分留言 点击查看完整评论页面