狐貍找兔 算法分析
阿新 • • 發佈:2017-11-29
根據 反向 麻煩 求余 簡單 循環 tdi c程序 如果
題目:
圍繞著山頂有10個洞,一只兔子和一只狐貍住在各自的洞裏,狐貍總想吃掉兔子,一天兔子對狐貍說,你想吃我有一個條件,你先把洞編號1到10,你從第10洞出發,先到第1號洞找我,第二次隔一個洞找我,第三次隔兩個洞找我,以後依次類推,次數不限,若能找到我你就可以飽餐一頓,在沒找到我之前不能停止,狐貍一想只有10個洞,尋找的次數又不限,哪有找不到的道理,就答應了條件,結果狐貍跑得昏了過去也沒找到兔子,請問兔子躲在哪個洞裏。程序中可假定狐貍找了1000次。
有兩種情況分別對應幾種算法,如果狐貍超過界限時,比如狐貍在第九個洞,下次尋找如果要去隔N隔洞時,9+N大於10的情況下,狐貍是回到1洞去找還是,從10洞折返回來,以10,9,8,7的順序去找,這就對應兩種算法
第一種 狐貍 回到1比較簡單,可以把洞延伸看做 1,2,3,4....8,9,10,1,2,3....8,9,10,1,2,3....這種循環,所以不存在方向性的問題,只需要根據位移對10求余,得到實際位移即可,在狐貍新達到的洞做予標記,下次跳過,並在結果輸出時反向篩選得到狐貍無法到達的洞口。
第二種 可以看做是 一個從 1,2,3...7,8,9,10,9,8,7.....,3,2,1這樣包含18各元素的數列循環,這樣也可以消除方向性帶來的麻煩,狐貍可以認為在前面的數列做循環,算法與上方類似。
第三種 就是硬算 定義方向值,求余得到位移。 實際位移是 a+bi ,i為方向值,值可以為1和-1,b為求余後的位移,a為初始位置
目前能想到的是這些方法
下面貼出 基於第二種方法的 C程序
#include<stdio.h> void main() { int a[18]={0}; int fox=1; int place=0; int weiyi,p; for(p=0;p<1000;p++) { weiyi=(p+2)%18; place=(place+weiyi)%18; if(a[place]==1) continue; a[place]=1; } for(int i=0;i<10;i++) { if(a[i]==0) printf("hole %d is safe\n",i+1); } }
狐貍找兔 算法分析