線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:885
推到 Plurk!
推到 Facebook!

如何將相同字之間相連起來

答題得分者是:RedSnow
IORIS
一般會員


發表:15
回覆:21
積分:7
註冊:2005-01-14

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-08-03 02:23:14 IP:220.139.xxx.xxx 未訂閱
假設我有一個矩陣為200*100 裡面存有許多的0跟1 現在我想要做的是 將相鄰的1 (假設相鄰的條件是:距離d < 5(變數)) 個別連起來 例如: 0010001000001001010000 變成 0011111000001111110000 (假設兩個1 相距5之內 把全部的0都變成1) 假如d距離很小(2-3) 我可以用幾個if 去寫出來 但當d一但變大甚至要能自變 救難倒我這個程式新手了 麻煩各位前輩 能幫我解答!! 謝謝 !! 發表人 - ioris 於 2005/08/03 02:28:07
RedSnow
版主


發表:79
回覆:1322
積分:845
註冊:2003-12-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-08-03 02:55:22 IP:61.230.xxx.xxx 未訂閱
IORIS 您好:    以下是我的想法,您參考一下:
const MYSIZE = 22;  // 先設一個小一點的 Size 作測試
int A[MYSIZE] = {0,0,1,0,0,0,1,0,0,0,0,0,1,0,0,1,0,1,0,0,0,0};
int d = 5;  // 相鄰條件數    // 先顯示目前陣列內容於 Memo 物件上
AnsiString S1 = "";
for(int i=0; iLines->Add(S1);    int pos = 0;
bool chk = false;  // 作為是否開始計算 0 的旗號
for(int i=0; iLines->Add(S2);
以上的陣列大小您可以稍後改為您要的大小。 7 天天敲鍵盤 v 時時按滑鼠 8
IORIS
一般會員


發表:15
回覆:21
積分:7
註冊:2005-01-14

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-08-03 12:21:51 IP:59.104.xxx.xxx 未訂閱
RedSnow 你好 多謝你的講解 不過程式有些部分我看不太懂 在向你請教一下 請問原本0010001000001001010000 每一個數的chk是 true or false 呢 以及我不知道你在哪時讀到第一個1 >"< 我是程式新手 麻煩各位前輩了 !!
RedSnow
版主


發表:79
回覆:1322
積分:845
註冊:2003-12-15

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-08-03 12:50:41 IP:59.115.xxx.xxx 未訂閱
IORIS 您好:
引言:請問原本0010001000001001010000 每一個數的chk是 true or false 呢 以及我不知道你在哪時讀到第一個1
chk 不是對應到每一個數,它只是一個布林邏輯變數,只有在設值給它的時候才會被變更,chk 的初值是設定成 false:
bool chk = false;
當程式在迴圈裡讀到某個陣列資料為 0 而且 chk 值不是 true 時,才會將 chk 設為 true:
if(A[i] == 0 && !chk && i!=0){ // !chk 表示 chk 不是 true 時
    chk = true;
    ....
迴圈是由陣列開頭逐一比對,在尚未碰到第一個 1 之前,若比對到的陣列為 0 的話,應該不能設定 chk 為 true,否則後續的計算會錯誤,因此另外又加上一個 i!=0 的判斷式,意思是比對的陣列不是第 0 個時才做設定 chk 為 true 的動作。 第一個 1 會在迴圈的 i 值為 2 時讀到。 7 天天敲鍵盤 v 時時按滑鼠 8
IORIS
一般會員


發表:15
回覆:21
積分:7
註冊:2005-01-14

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-08-03 12:54:16 IP:59.104.xxx.xxx 未訂閱
多謝 前輩的解說    雖然我看不太懂chk 的寫法     所以我改寫一下 我想寫的是  當出現10 及之後第二個1時    
    for(int i=1; i    這樣子跑出來的結果應該是對的 
但不知道有無少考慮到的地方    以及我想多寫判斷 當他是孤立的1時 
我要將他改寫成0
那要怎麼修改呢?    請各位前輩 指教!!        發表人 - ioris 於 2005/08/03  13:04:47
        
RedSnow
版主


發表:79
回覆:1322
積分:845
註冊:2003-12-15

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-08-03 14:41:45 IP:59.115.xxx.xxx 未訂閱
IORIS 您好:    您的寫法沒有什麼問題,而且比我原先寫的還要簡潔些,但是重設 1 的動作後,應將 pos 歸零,否則遇有連續相鄰的 1 之後的處理會有誤。    您的第二個問題所說的 "當他是孤立的1時",也可以用您的方式來處理,只是比對條件改為 010 即可,只是對於回圈開始與結束這兩個位置要特別加上比對,開頭時比對 10,而結尾時比對 01,例如:
    ... 前略...
    int pos = -1;  // 不為 -1 代表有孤立 1 的資料要代換
    for (int i=1; i
            if (A[i-1] == 1 && A[i] == 0) {  // 比對 10
                pos = i-1;
            }
        } else if(i == MYSIZE-1) {  // 若為陣列
            if (A[i-1] == 0 && A[i] == 1) {  // 比對 01
                pos = i;
            }
        } else {  // 陣列除卻首尾之外的中間部份
            if (A[i-1] == 0 && A[i] == 1 && A[i 1] == 0) {  // 比對 010
                pos = i;
            }
        }            if(pos != -1){
            A[pos] = 2; // 先用 2 來做驗證,要正式使用時再改回 0
            pos = -1;
        }
    }
    ... 後略 ...
7 天天敲鍵盤 v 時時按滑鼠 8 發表人 - RedSnow 於 2005/08/03 21:23:14
IORIS
一般會員


發表:15
回覆:21
積分:7
註冊:2005-01-14

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-08-03 20:55:22 IP:59.104.xxx.xxx 未訂閱
我瞭解了 多謝RedSnow大大 你提供的方法 我解決了我的問題 感激不盡
RedSnow
版主


發表:79
回覆:1322
積分:845
註冊:2003-12-15

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-08-03 21:28:34 IP:59.115.xxx.xxx 未訂閱
IORIS 您好:    您太客氣了,其實在這討論都是教學相長,您瞧;您修改過後的程式不是反而比較簡潔嗎?很高興知道能幫上忙,祝您順心~    (剛才發現前一篇的註解有誤,比對 010 誤植為 比對 101,已予更正) 7 天天敲鍵盤 v 時時按滑鼠 8
系統時間:2024-05-18 4:53:40
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!