2016-10-06 37 views
1

電路板有10行和10列按鈕全是綠色。該板隨機產生9個紅色障礙物。我的問題是如何找到從入口到出口的路徑(將綠色更改爲白色),只使用綠色按鈕進行水平和垂直。每次當我點擊Go按鈕時,綠色按鈕都會變成白色。程序一次只能找到一條路徑。例如第一個路徑執行(2(10)-1),然後當我再次按下Go按鈕時,它會找到另一個路徑。這將繼續,直到所有的綠色按鈕變爲白色。 btn 1是條目,而btn 100是退出。我使用點擊事件.....?C#找到不同按鈕顏色之間的路徑

for (int i = 1; i <= 99;) 
{ 

    string btn_name = "btn" + Convert.ToString(i+10); 
    var btn_now = this.Controls.Find(btn_name, true)[0]; 

    btn_name = "btn" + Convert.ToString(i + 1); 
    var btn_next = this.Controls.Find(btn_name, true)[0]; 
    var btn_below = btn_next; 



    if (i <= 10 || i == 20 || i == 30 || i == 40 || i == 50 || i == 60 || i == 70 || i == 80 || i == 90) 
    { 
     btn_name = "btn" + Convert.ToString(i); 
     btn_below = this.Controls.Find(btn_name, true)[0]; 
    } 
    if(btn_next.BackColor == Color.GreenYellow) { 

     if (i <= 10 || i == 20 || i == 30 || i == 40 || i == 50 || i == 60 || i == 70 || i == 80 || i == 90) 
      i+= 1; 
     else 
      i++; 
     btn_now = btn_next; 
    } 
    else { 
     btn_now = btn_next; 
     i+=1;      
    } 
    btn_now.BackColor = Color.White; 

} 

image

+0

我無法理解你的代碼背後的邏輯......像什麼是點<<如果(I <= 10 ||我== || 20 ==我30 ||我== 40 || i == 50 || i == 60 || i == 70 || i == 80 || i == 90) i + = 1; else i ++; >>(+ + 1和i ++都是一樣的......) – Innat3

+0

你需要找到一條路徑或最短路徑? – iceDragon

+0

可能最好查看A *搜索算法,該算法通過評估每條可能路徑並以最低成本找到路徑。 https://en.wikipedia.org/wiki/A*_search_algorithm#Example – lhildebrandt

回答

1

你並不需要一個100個*細胞。

我所使用的算法大致是這樣的:

指定的0「退出」細胞「距離」,將其添加到「參觀」「參觀」列表 的foreach細胞,未訪問過的鄰居添加到「訪問「距離+ 1列表 重複,直到找到單元格或沒有找到新單元格

此時我們有一個單元格列表以及它們與出口的距離。如果我們沒有找到入口點,則返回null。

創建一個空的列表「路徑」,並添加條目單元格。然後,從入口單元開始,尋找一個比當前單元「距離」小1的鄰居。將這個單元格添加到我們的路徑並重復,直到找到出口。

然後我們有一個最短的路徑。 (要查找所有最短路徑,請查找距離當前單元格「距離」1的所有鄰居,並複製當前路徑或使用比列表更復雜的結構來存儲路徑)。

這個算法在javascript中實現在這個網頁上。

http://eastereggs.azurewebsites.net/eastereggs

+0

非常感謝!我幾乎退出了這個項目。我理解的邏輯,但我的問題是布爾我用所有的按鈕,並添加在不同的列表(訪問和未訪問列表)或我怎麼知道按鈕訪問或不.... ....? – zelalem