大學生新聞網,大學生新聞發布平臺
大學生新聞網
大學生新聞大學生活校園文學大學生村官
社會實踐活動社會實踐經歷社會實踐報告社會實踐總結社會實踐心得
全國排名校友會版軟科排名分類排名本科排名一本排名二本排名專科排名學校地址
求職簡歷職場法則面試技巧職場故事求職招聘大學生就業
英語學習計算機學習電氣工程機械工程經濟管理建筑設計財務會計
申請書證明書檢討書自薦信演講稿心得體會調查報告讀后感求職信推薦信其它范文

C語言三色旗問題

有一根繩子,上面有紅、白、藍三種顏色的旗子。繩子上旗子的顏色并沒有順序,現在要對旗子進行分類,按照藍色、白色、紅色的順序排列。只能在繩子上進行移動,并且一次只能調換兩面旗子,怎樣移動才能使旗子移動的次數最少?

算法思想
旗子在繩子上移動,而且一次只能調換兩面旗子,因此只要保證在移動旗子時,從繩子的開頭開始,遇到藍色旗子向前移動,遇到白色旗子則留在中間,而遇到紅色的旗子則向后移動。要使移動次數最少,可以使用三個指針 b、w、r 分別作為藍旗、白旗和紅旗的指針。

若 w 指針指向的當前旗子為白色,則 w 指針增加 1,表示白旗部分增加一面。若 w 指針指向的當前旗子為藍色,則將 b 指針與 w 指針所指向的旗子交換,同時 b 指針與 w 指針都增加 1,表示藍旗和白旗部分都多了一個元素。若 w 指針指向的當前旗子為紅色,則將 w 指針與 r 指針所指向的旗子交換,同時 r 指針減 1,即 r 指針向前移動,未處理的部分減 1。剛開始時,r 指向繩子中最后一個旗子,之后 r 指針不斷前移,當其位于 w 指針之前,即 r 的值小于 w 的值時,全部旗子處理完畢,可以結束比較和移動旗子操作。


在程序中通過宏定義用大寫字母 'B' 'W' 'R' 分別代表藍色、白色和紅色;字符數組 “char color[]”表示繩子上的各種顏色的旗子;旗子移動時通過一個 while 循環判斷移動過程是否結束,在 while 循環中根據旗子的不同顏色進行不同的處理。

程序代碼

#include <stdio.h>
#include <stdlib.h>
#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;}
 
int main()
{
    char color[]={'R','W','B','W','W','B','R','B','W','R','\0'};
    int w=0;
    int b=0;
    int r=strlen(color)-1;
    int i;
 
    for(i=0;i<strlen(color);i++)
        printf("%c ",color[i]);
    printf("\n");
    while(w<=r)
    {
        if(color[w]==WHITE)
            w++;
        else
        {
            if(color[w]==BLUE)
            {
                swap(b,w);
                b++;
                w++;
            }
            else
            {
                while(w<r&&color[r]==RED)
                    r--;
                swap(r,w);
                    r--;
            }
        }
    }
    for(i=0;i<strlen(color);i++)
        printf("%c ",color[i]);
    printf("\n");
    return 0;
}
調試運行結果
交換前旗子顏色排列順序及按順序最少次數移動旗子后的排列順序如下所示:
R W B W W B R B W R
B B B W W W W R R R
總結
在該實例中,分別用語句“int w=0;”“int b = 0;”“int r=strlen(color)-1;”定義并初始化白旗、藍旗、紅旗的指針 w、b、r。在交換不同顏色旗子時,通過旗子的指針實現交換函數 swap 的功能。
    作者:大學生新聞網    來源:大學生新聞網
    發布時間:2025-03-10    閱讀:
    掃一掃 分享悅讀
  • C語言整數逆序輸出
  • 將一個從鍵盤輸入的整數存放到一個數組中,通過程序的運行按照數組中的逆序輸出該整數,利用遞歸的方法解決問題。
  • 03-10 關注:0
  • C語言約瑟夫環問題
  • 編號為 1,2,3,…,n 的 n 個人圍坐一圈,任選一個正整數 m 作為報數上限值,從第一個人開始按順時針方向報數,報數到 m 時停止,報
  • 03-10 關注:0
  • C語言輸出等腰三角形
  • 本實例要求從鍵盤輸入任意整數 n,通過程序運行輸出對應高度為 n 的等腰三角形。
  • 03-10 關注:0
  • C語言字符串加密和解密算法
  • 在本實例中要求設計一個加密和解密算法。在對一個指定的字符串加密之后,利用解密函數能夠對密文解密,顯示明文信息。
  • 03-09 關注:3
  • C語言統計單詞個數,單詞個數算法
  • 在實際生活中經常會遇到一個問題:寫英語作文時,常常要求滿足一定的字數。在以往,要么我們一個一個地數;要么我們估算一行的單詞數,
  • 03-09 關注:3
  • C語言獲取矩陣的最大值及其下標
  • 本實例要求使用二維數組將一個 3×4 的矩陣中所有元素的最大值及其下標獲取,通過該程序,掌握二維數組的引用知識。
  • 03-09 關注:4
主站蜘蛛池模板: 亚洲欧美精品一中文字幕| 天天摸天天操免费播放小视频| 国产成人综合在线视频| 亚洲人成精品久久久久| 69国产成人精品午夜福中文| 欧美色欧美亚洲高清在线观看| 大学生一级毛片免费看**| 亚洲综合视频网| 97av麻豆蜜桃一区二区| 欧美日韩成人午夜免费| 国产精品白丝在线观看有码| 亚洲国产精品热久久| www.色日本| 日韩色视频在线观看| 国产凌凌漆国语| 久久久久久亚洲av无码专区| 老色鬼久久综合第一| 性欧美大战久久久久久久野外| 卡一卡2卡3卡精品网站| 一二三四在线观看高清| 狠狠色噜噜狠狠狠狠69| 国产网站免费看| 亚洲va成无码人在线观看| 黄色香蕉视频网站| 无遮挡全彩口工h全彩| 午夜福利一区二区三区高清视频 | 特级做a爰片毛片免费看一区| 夜夜夜精品视频免费| 亚洲国产成人精品女人久久久| 午夜小视频免费| 日本特黄特色aaa大片免费| 啊轻点灬大ji巴太粗太长了视| xxxx俄罗斯大白屁股| 欧美日韩国产精品自在自线| 国产欧美日韩综合精品一区二区 | 国产日韩精品中文字无码| 久久久久成人精品无码| 精品人妻无码区二区三区| 国产麻豆天美果冻无码视频| 亚洲av网址在线观看| 色屁屁影视大全|