經典程式設計題 ABC各教那門課

2021-06-23 03:10:42 字數 1783 閱讀 7258

a、b、c是小學老師,各教2門課,互不重複。共有如下6門課:語文、算術、政治、地理、**和美術。

已知: (1)政治老師和算術老師是鄰居。 (2)地理老師比語文老師年齡大。 (3)b最年輕。  

(4)a經常對地理老師和算術老師講他看過的文學作品。 (5)b經常和**老師、語文老師一起游泳。 

請程式設計輸出a、b、c各教哪兩門課。 

分析:首先要得到所有可能的組合,一共有6*5*4*3*2/(2*2*2)種。

然後根據已知的3個條件進行排除,最後得到一種情況。

那麼如何獲得所有可能的組合呢?

這裡我採用了乙個stringbuffer = 「000000」,

然後使用1,2,3,4,5,6分別代表各個課程,「123456」和「654321」自然是不同的組合,abc3位教師按照順序對於各自的2門課程。

如321546代表著,教師a教授政治,算術,教師b教授語文,**,教師c教授地理和美術。

然後用隨機數確定1,2,3,4,5,6的位置,如果相應的位置的字元不為0,代表著這個位置已經被占用,需要重新隨機。直到6個字元全部分配到正確的位置。

public boolean putstring(stringbuffer s, int i, char c) 

s.setcharat(i, c);

return true;

}

while (set.size() < 6 * 5 * 4 * 3 * 2/8)  while (!putstring(index, i, '1'));

do while (!putstring(index, i, '2'));

do while (!putstring(index, i, '3'));

do while (!putstring(index, i, '4'));

do while (!putstring(index, i, '5'));

do while (!putstring(index, i, '6'));

replaceindex(index);

set.add(index.tostring());

}

這裡存在乙個問題,隨機產生的順序比如123456和214365和213456等等顯然是不同的,但是卻都歸為一種情況,因為一位教師教2門課。

那麼如何剔除重複的情況呢?

這裡是把得到的字串進行排序,確保只有一種情況。

public void replaceindex(stringbuffer s)

} }

這樣就可以了。

最後只需要按照條件進行判斷就可以了:

for(string s:set)

if(s.indexof("14") == 0 ||s.indexof("23") == 2 || s.indexof("23") == 4)

if(s.indexof("4") == 2 ||s.indexof("4") == 3 )

if(s.indexof("2") == 0 ||s.indexof("23") == 1 || s.indexof("4") == 0|| s.indexof("4") == 1)

if(s.indexof("1") == 2 ||s.indexof("1") == 3 || s.indexof("5") == 2|| s.indexof("5") == 3)

str = s;

}

最後結果是:a教授語文,政治。b教授算術,美術。c教授地理,**

入門經典程式設計題

編寫乙個靜態方法histogram 接收乙個整型陣列a和乙個整型m返回乙個大小為m的陣列 其中第i個元素的值為整數i在引數陣列 現的次數。如果a中的值均在到0到m 1之間,返回陣列中所有元素之和應該和a.length相等.讀題是真的費勁,整個例子吧 陣列a m 7,新陣列b 第0個元素的值為整數0在...

java經典程式設計題(13 15)

public class demo1 執行結果 public class demo1 sum sum day 再加上某天的天數 判斷是不是閏年 if year 400 0 year 4 0 year 100 0 leap 1 else leap 0 如果是閏年且月份大於2,總天數應該加一天 if l...

java經典程式設計題 19 21

1.程式分析 先把圖形分成兩部分來看待,前四行乙個規律,後三行乙個規律,利用雙重 for迴圈,第一層控制行,第二層控制列。public class demo1 system.out.println for int i 3 i 1 i system.out.println public class d...