1樓:匿名使用者
最簡單的解法,把這個當做排列組合問題。然後把所有的排列組合結果帶入到1-6這6個條件中進行檢驗。最後把滿足所有條件的組合結果輸出即可。
把四人姓的**儲存在a[3]中 (用**方便運算並節約空間,值全用int,按格蘭德、白思特、弗羅斯特和達特順序為0-3)
四人名的**儲存在b[3]中 (莎莉=0,羅達=1,特雷西=2,萬達=3)
樹苗種類**儲存在c[3]中 (楓樹=0,灰樹=1,櫻桃=2,雲杉=3)
同理,院子位置**d[3], (花園=0,院子前=1,院子後=2,天井=3)
種樹日子e[3] (星期一=0,星期三=1,星期四=2,星期五=3)
排列組合**自行解決下,假設每次生成結果用x陣列儲存,x[0]代**蘭德,x[1]代表白思特……,x陣列的每個元素結構如下:
struct choice;
自己寫個函式int find(x,arg1,arg2,arg3)
x為陣列指標
arg1為指定已知條件,arg3為指定已知條件的值,arg2為指定返回條件,返回值為arg2指定的返回項。
arg1和arg2的值為0、1、2、3,4分別代表姓、名、樹苗種類、位置、日期五個屬性。
舉例來說, s = find(x,2,3,2);這句話的含義就是找到x陣列裡樹苗種類為櫻桃的那條記錄,返回它的栽種位置,返回值寫入s中。
然後編寫6條件判斷:
1.姓弗羅斯特的人星期一種樹;把樹苗重在院子花園裡的人是星期三種樹;萬達星期四種樹;種楓樹的人星期五種樹。
(x[2].d == e[0])&&(find(x,3,4,0) == e[1]) &&(find(x,1,4,3) == e[2]) && (find(x,2,4,0) == e[3] )
2.特雷西在姓達特的人之前種樹,在種灰樹的那個人之後種樹。
int temp = find(x,1,4,2)
(temp < find(x,0,4,3) )&&(temp > find(x,2,4,1))
3.姓白思特的那個人把自己的樹重在了院子前面,她並不叫莎莉,也沒有在星期五種樹。
(find(x,0,1,1) != b[0] ) && ( find(x,0,4,1) != e[3])
4.羅達並沒有在星期一種樹。
find(x,1,4,1) != e[0]
5.姓格蘭德的人種樹的時間比把樹重在院子後面的人要早;羅達並沒有種櫻桃樹。
(find(x,0,4,0) < find(x,3,4,2))&&( find(x,1,2,1) != c[2])
6、萬達並不姓弗羅斯特,沒有把她的雲杉樹種到天井裡。
(find(x,1,0,3) != a[2])&&(find(x,1,2,3) == c[3])&&(find(x,1,3,3) != d[3])
當然這裡還可以簡化一下,讓萬達和雲杉這兩個元素繫結起來。或者改進下資料結構比如用連結串列代替陣列,如果題目擴充也能稍做調整就可以完成運算。不過大致的思路就是這樣了。
有不懂的地方再交流。
2樓:匿名使用者
甲乙丙丁4人中有一人為長沙人,已知有一人撒謊。
甲:我不是長沙人
乙:丙是長沙人
丙:丁是長沙人
丁:丙說謊
解法思路:採用窮舉法,依次設甲乙丙丁為長沙人,找到關係式,由於有一人撒謊,所以4個等式相加為3(1為真)即可
main()}}
3樓:蔡庚
這種題可以不用程式設計,有更好的方法.
先想想出題人會怎樣出題,他不太可能把它們的邏輯關係在腦子裡記得那麼清楚.
我猜他是用**他們的邏輯關係表示出來.然後再給我們列出條件.
所以,你也可以辦他們列成**,先隨便列出第一行,類如先列出四個人的姓名.
a,b,c,d
再根據給出的條件對應給下面新增他們的邏輯關係,就可以很快搞定了.
絕對原創.
本人幾年前就用此法做出一道比樓主的問題更復雜的問題.
C語言入門,急求高手大蝦指教!!!!
不廢話,給你指明路兩條 一 一本好書,電腦程式的架構與設計 被稱為c語言的巫師之書,之所以這麼說,不在於它的厚度和所謂的名氣,而在於它的內容和高度。看完之後,相信你對計算機乃至程式語言會有乙個全新的認識和理解。雖然內容不深,但也恰恰合了初學者的需要。同意 小兔子尋花問柳 的。先看譚浩強的書進行下入...
用c語言程式設計這道題,求大神講解,指教,謝謝了
這個是很基礎的,就是從鍵盤獲得數,然後根據條件判斷,滿足條件執行迴圈體裡的內容,最後列印出來 1.定義結構體 struct student 2.計算平均函式 平均成績存放在該學生的結構體的avg成員中 void avg struct student s 3.冒泡法,選擇法排序 省略 4.輸出,省略 ...
用c語言中函式有那位高手只用遞迴的方法求解1!
我學c 的,至少函式可以參考吧,就是標頭檔案和輸出與c不一樣 include using namespace std int factorial int n int main 這個程式求階乘 求和都用的是遞迴 在vs2008下除錯通過 include stdio.h int fun1 int i 遞...