亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? 二四點.txt

?? 搜羅精品
?? TXT
字號:
關于二十四點游戲的編程思路與基本算法


  漫長的假期對于我來說總是枯燥無味的,閑來無聊便和同學玩起童年時經常玩的二十四點牌游戲來。此游戲說來簡單,就是利用加減乘除以及括號將給出的四張牌組成一個值為24的表達式。但是其中卻不乏一些有趣的題目,這不,我們剛玩了一會兒,便遇到了一個難題——3、6、6、10(其實后來想想,這也不算是個太難的題,只是當時我們的腦筋都沒有轉彎而已,呵呵)。

  問題既然出現了,我們當然要解決。冥思苦想之際,我的腦中掠過一絲念頭——何不編個程序來解決這個問題呢?文曲星中不就有這樣的程序嗎?所以這個想法應該是可行。想到這里我立刻開始思索這個程序的算法,最先想到的自然是窮舉法(后來發現我再也想不到更好的方法了,悲哀呀,呵呵),因為在這學期我曾經寫過一個小程序——計算有括號的簡單表達式。只要我能編程實現四個數加上運算符號所構成的表達式的窮舉,不就可以利用這個計算程序來完成這個計算二十四點的程序嗎?確定了這個思路之后,我開始想這個問題的細節。 
首先窮舉的可行性問題。我把表達式如下分成三類——
1、 無括號的簡單表達式。
2、 有一個括號的簡單表達式。
3、 有兩個括號的較復4、 雜表達式。
窮舉的開始我對給出的四個數進行排列,其可能的種數為4*3*2*1=24。我利用一個嵌套函數實現四個數的排列,算法如下:
/* ans[] 用來存放各種排列組合的數組 */
/* c[] 存放四張牌的數組 */
/* k[] c[]種四張牌的代號,其中k[I]=I+1。
用它來代替c[]做處理,考慮到c[]中有可能出現相同數的情況 */
/* kans[] 暫存生成的排列組合 */
/* j 嵌套循環的次數 */
int fans(c,k,ans,kans,j)
int j,k[],c[];char ans[],kans[];
{ int i,p,q,r,h,flag,s[4],t[4][4];
for(p=0,q=0;p<4;p++)
{ for(r=0,flag=0;r if(k[p]!=kans[r]) flag++;
if(flag==j) t[j][q++]=k[p];
}
for(s[j]=0;s[j]<4-j;s[j]++)
{ kans[j]=t[j][s[j]];
if(j==3) { for(h=0;h<4;h++)
ans[2*h]=c[kans[h]-1]; /* 調整生成的排列組合在最終的表
達式中的位置 */
for(h=0;h<3;h++)
symbol(ans,h); /* 在表達式中添加運算符號 */
}
else { j++;
fans(c,k,ans,kans,j);
j--;
}
}
}

  正如上面函數中提到的,在完成四張牌的排列之后,在表達式中添加運算符號。由于只有四張牌,所以只要添加三個運算符號就可以了。由于每一個運算符號可重復,所以計算出其可能的種數為4*4*4=64種。仍然利用嵌套函數實現添加運算符號的窮舉,算法如下:

/* ans[],j同上。sy[]存放四個運算符號。h為表達式形式。*/
int sans(ans,sy,j,h)
char ans[],sy[];int j,h;
{ int i,p,k[3],m,n; char ktans[20];
for(k[j]=0;k[j]<4;k[j]++)
{ ans[2*j+1]=sy[k[j]]; /* 剛才的四個數分別存放在0、2、4、6位
這里的三個運算符號分別存放在1、3、5位*/ 
if(j==2)
{ ans[5]=sy[k[j]];
/* 此處根據不同的表達式形式再進行相應的處理 */
}
else { j++; sans(ans,sy,j--,h); }
}
}

  好了,接下來我再考慮不同表達式的處理。剛才我已經將表達式分為三類,是因為添加三個括號對于四張牌來說肯定是重復的。對于第一種,無括號自然不用另行處理;而第二種情況由以下代碼可以得出其可能性有六種,其中還有一種是多余的。
for(m=0;m<=4;m+=2)
for(n=m+4;n<=8;n+=2)
  這個for循環給出了添加一個括號的可能性的種數,其中m、n分別為添加在表達式中的左右括號的位置。我所說的多余的是指m=0,n=8,也就是放在表達式的兩端。這真是多此一舉,呵呵!最后一種情況是添加兩個括號,我分析了一下,發現只可能是這種形式才不會是重復的——(a b)(c d)。為什么不會出現嵌套括號的情況呢?因為如果是嵌套括號,那么外面的括號肯定是包含三個數字的(四個沒有必要),也就是說這個括號里面包含了兩個運算符號,而這兩個運算符號是被另外一個括號隔開的。那么如果這兩個運算符號是同一優先級的,則肯定可以通過一些轉換去掉括號(你不妨舉一些例子來試試),也就是說這一個括號沒有必要;如果這兩個運算符號不是同一優先級,也必然是這種形式((a+-b)*/c)。而*和/在這幾個運算符號中優先級最高,自然就沒有必要在它的外面添加括號了。

  綜上所述,所有可能的表達式的種數為24*64*(1+6+1)=12288種。哈哈,只有一萬多種可能性(這其中還有重復),這對于電腦來說可是小case喲!所以,對于窮舉的可行性分析和實現也就完成了。


  接下來的問題就是如何對有符號的簡單表達式進行處理。這是棧的一個著名應用,那么什么是棧呢?棧的概念是從日常生活中貨物在貨棧種的存取過程抽象出來的,即最后存放入棧的貨物(堆在靠出口處)先被提取出去,符合“先進后出,后進先出”的原則。這種結構猶如子彈夾。
在棧中,元素的插入稱為壓入(push)或入棧,元素的刪除稱為彈出(pop)或退棧。

  棧的基本運算有三種,其中包括入棧運算、退棧運算以及讀棧頂元素,這些請參考相關數據結構資料。根據這些基本運算就可以用數組模擬出棧來。

  那么作為棧的著名應用,表達式的計算可以有兩種方法。

  第一種方法——
  首先建立兩個棧,操作數棧OVS和運算符棧OPS。其中,操作數棧用來記憶表達式中的操作數,其棧頂指針為topv,初始時為空,即topv=0;運算符棧用來記憶表達式中的運算符,其棧頂指針為topp,初始時,棧中只有一個表達式結束符,即topp=1,且OPS(1)=‘;’。此處的‘;’即表達式結束符。
  然后自左至右的掃描待處理的表達式,并假設當前掃描到的符號為W,根據不同的符號W做如下不同的處理:
1、 若W為操作數
2、 則將W壓入操作數棧OVS
3、 且繼續掃描下一個字符
4、 若W為運算符
5、 則根據運算符的性質做相應的處理:
(1)、若運算符為左括號或者運算符的優先級大于運算符棧棧頂的運算符(即OPS(top)),則將運算符W壓入運算符棧OPS,并繼續掃描下一個字符。
(2)、若運算符W為表達式結束符‘;’且運算符棧棧頂的運算符也為表達式結束符(即OPS(topp)=’;’),則處理過程結束,此時,操作數棧棧頂元素(即OVS(topv))即為表達式的值。
(3)、若運算符W為右括號且運算符棧棧頂的運算符為左括號(即OPS(topp)=’(‘),則將左括號從運算符棧談出,且繼續掃描下一個符號。
(4)、若運算符的右不大于運算符棧棧頂的運算符(即OPS(topp)),則從操作數棧OVS中彈出兩個操作數,設先后彈出的操作數為a、b,再從運算符棧OPS中彈出一個運算符,設為+,然后作運算a+b,并將運算結果壓入操作數棧OVS。本次的運算符下次將重新考慮。

  第二種方法——
  首先對表達式進行線性化,然后將線性表達式轉換成機器指令序列以便進行求值。

  那么什么是表達式的線性化呢?人們所習慣的表達式的表達方法稱為中綴表示。中綴表示的特點是運算符位于運算對象的中間。但這種表示方式,有時必須借助括號才能將運算順序表達清楚,而且處理也比較復雜。

   1929年,波蘭邏輯學家Lukasiewicz提出一種不用括號的邏輯符號體系,后來人們稱之為波蘭表示法(Polish notation)。波蘭表達式的特點是運算符位于運算對象的后面,因此稱為后綴表示。在對波蘭表達式進行運算,嚴格按照自左至右的順序進行。下面給出一些表達式及其相應的波蘭表達式。
表達式 波蘭表達式
A-B AB-
(A-B)*C+D AB-C*D+
A*(B+C/D)-E*F ABCD/+*EF*-
(B+C)/(A-D) BC+AD-/

  OK,所謂表達式的線性化是指將中綴表達的表達式轉化為波蘭表達式。對于每一個表達式,利用棧可以把表達式變換成波蘭表達式,也可以利用棧來計算波蘭表達式的值。

  至于轉換和計算的過程和第一種方法大同小異,這里就不再贅述了。

  下面給出轉換和計算的具體實現程序——

/* first函數給出各個運算符的優先級,其中=為表達式結束符 */
int first(char c)
{ int p;
switch(c)
{ case '*': p=2; break;
case '/': p=2; break;
case '+': p=1; break;
case '-': p=1; break;
case '(': p=0; break;
case '=': p=-1; break;
}
return(p);
}
/* 此函數實現中綴到后綴的轉換 */
/* M的值宏定義為20 */
/* sp[]為表達式數組 */
int mid_last()
{ int i=0,j=0; char c,sm[M];
c=s[0]; sm[0]='='; top=0;
while(c!='\0')
{ if(islower(c)) sp[j++]=c;
else switch(c)
{ case '+':
case '-':
case '*':
case '/': while(first(c)<=first(sm[top]))
sp[j++]=sm[top--];
sm[++top]=c; break;
case '(': sm[++top]=c; break;
case ')': while(sm[top]!='(')
sp[j++]=sm[top--];
top--; break;
default :return(1);
}
c=s[++i];
}
while(top>0) sp[j++]=sm[top--];
sp[j]='\0'; return(0);
}
/* 由后綴表達式來計算表達式的值 */
int calc()
{ int i=0,sm[M],tr; char c;
c=sp[0]; top=-1;
while(c!='\0')
{ if(islower(c)) sm[++top]=ver[c-'a'];/*在轉換過程中用abcd等來代替數,
這樣才可以更方便的處理非一位數, 
ver數組中存放著這些字母所代替的數*/
else switch(c)
{ case '+': tr=sm[top--]; sm[top]+=tr; break;
case '-': tr=sm[top--]; sm[top]-=tr; break;
case '*': tr=sm[top--]; sm[top]*=tr; break;
case '/': tr=sm[top--];sm[top]/=tr;break;
default : return(1);
}
c=sp[++i];
}
if(top>0) return(1);
else { result=sm[top]; return(0); }
}

  這樣這個程序基本上就算解決了,回過頭來拿這個程序來算一算文章開始的那個問題。哈哈,算出來了,原來如此簡單——(6-3)*10-6=24。

  最后我總結了一下這其中容易出錯的地方——

  1、 排列的時候由于一個數只能出現一次, 所以必然有一個判斷語句。但是用什么來判斷,用大小顯然不行,因為有可能這四個數中有兩個或者以上的數是相同的。我的方法是給每一個數設置一個代號,在排列結束時,通過這個代號找到這個數。

  2、在應用嵌套函數時,需仔細分析程序的執行過程,并對個別變量進行適當的調整(如j的值),程序才能正確的執行。

  3、在分析括號問題的時候要認真仔細,不要錯過任何一個可能的機會,也要盡量使程序變得簡單一些。不過我的分析可能也有問題,還請高手指點。 

  4、在用函數對一個數組進行處理的時候,一定要注意如果這個數組還需要再應用,就必須將它先保存起來,否則會出錯,而且是很嚴重的錯誤。

  5、在處理用戶輸入的表達式時,由于一個十位數或者更高位數是被分解成各位數存放在數組中,所以需對它們進行處理,將它們轉化成實際的整型變量。另外,在轉化過程中,用一個字母來代替這個數,并將這個數存在一個數組中,且它在數組中的位置和代替它的這個字母有一定的聯系,這樣才能取回這個數。

  6、由于在窮舉過程難免會出現計算過程中有除以0的計算,所以我們必須對calc函數種對于除的運算加以處理,否則程序會因為出錯而退出(Divide by 0)。

  7、最后一個問題,本程序尚未解決。對于一些比較著名的題目,本程序無法解答。比如說5、5、5、1或者8、8、3、3。這是由于這些題目在計算的過程用到了小數,而本程序并沒有考慮到小數。

  最后,由于此文檔并沒有在寫程序的同時完成,所以難免因為記憶的差錯和小弟水平的不足而有不少錯誤,還望各位批評指正;或者你認為我寫得還不夠清楚,你也可以給我來信討論。

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
色婷婷久久久综合中文字幕| 国产欧美日韩另类视频免费观看| 日韩精品一区二区三区四区| 久久久精品天堂| 亚洲成人一区在线| 成人国产精品免费| 日韩一区二区不卡| 亚洲欧洲制服丝袜| 国产乱码精品1区2区3区| 717成人午夜免费福利电影| 国产精品久久久久一区| 久久99在线观看| 91精品啪在线观看国产60岁| 亚洲视频在线一区| 国产成人精品网址| 精品国产乱码久久久久久影片| 亚洲一二三区不卡| 91视频国产观看| 欧美高清在线一区二区| 久久成人羞羞网站| 日韩欧美一区二区久久婷婷| 亚洲成人资源网| 在线亚洲免费视频| 亚洲男人电影天堂| 91美女福利视频| 亚洲欧洲日韩av| 不卡一区中文字幕| 国产精品动漫网站| aaa欧美日韩| 日韩毛片一二三区| 在线亚洲免费视频| 亚洲国产成人高清精品| 欧洲生活片亚洲生活在线观看| 亚洲欧美另类久久久精品2019 | 欧美国产精品久久| 国产激情视频一区二区三区欧美 | 国产精品三级视频| 国产黄色精品视频| 久久综合精品国产一区二区三区| 老司机精品视频导航| 久久尤物电影视频在线观看| 韩国一区二区视频| 久久精品亚洲一区二区三区浴池| 国产成人激情av| 亚洲欧美区自拍先锋| 在线观看欧美精品| 日韩**一区毛片| 日韩一二三区视频| 国产精品一区二区三区乱码| 一区精品在线播放| 欧美色手机在线观看| 青青草一区二区三区| 久久欧美一区二区| 91久久精品一区二区二区| 亚洲成a天堂v人片| 精品国产乱码久久久久久牛牛| 国产福利91精品一区二区三区| 中文字幕一区二区三区精华液 | 丁香啪啪综合成人亚洲小说| 中文一区在线播放| 色悠悠久久综合| 日韩av一级片| 中文字幕欧美日韩一区| 色老汉一区二区三区| 久久av中文字幕片| 亚洲欧美偷拍另类a∨色屁股| 欧美妇女性影城| 国产精品一区二区黑丝| 樱桃国产成人精品视频| 欧美精品一区二区三区高清aⅴ| 成人精品国产福利| 首页国产欧美日韩丝袜| 国产欧美精品区一区二区三区| 欧美视频第二页| 国产福利精品一区| 日本在线不卡一区| 中文字幕一区三区| 久久综合视频网| 欧美日韩精品一区视频| 成人免费av网站| 日韩av在线发布| 亚洲在线免费播放| 国产视频一区二区在线| 7777精品伊人久久久大香线蕉最新版| 国产精品影音先锋| 日韩高清不卡一区| 亚洲综合区在线| 欧美激情一区二区三区不卡 | 在线观看亚洲专区| 国产精品一区专区| 日本三级亚洲精品| 亚洲国产美国国产综合一区二区| 久久久精品中文字幕麻豆发布| 777午夜精品免费视频| 色天使色偷偷av一区二区| 国产91露脸合集magnet| 麻豆精品蜜桃视频网站| 亚洲成人7777| 一区二区三区精品视频| 亚洲图片另类小说| 国产精品久久久久久一区二区三区 | 国产精品久久久久毛片软件| 久久青草国产手机看片福利盒子| 日韩欧美你懂的| 91精品国产手机| 欧美色偷偷大香| 欧美日韩国产一级片| 91电影在线观看| 色婷婷综合五月| 色婷婷综合久久久中文字幕| 不卡的电影网站| eeuss鲁片一区二区三区| 豆国产96在线|亚洲| 国产精品一级在线| 国产精品自在在线| 国产盗摄精品一区二区三区在线| 紧缚奴在线一区二区三区| 久久超碰97人人做人人爱| 蜜臀av在线播放一区二区三区| 美国三级日本三级久久99| 蜜臀国产一区二区三区在线播放 | 自拍偷拍欧美精品| 最新成人av在线| 亚洲激情av在线| 亚洲一区二区三区影院| 日韩精彩视频在线观看| 美女在线视频一区| 国产精品99久久久久久久女警| 国产伦精品一区二区三区免费| 国产精品亚洲午夜一区二区三区| 国产一区二区三区香蕉| 盗摄精品av一区二区三区| a美女胸又www黄视频久久| 色综合久久中文综合久久牛| 欧美亚洲日本国产| 欧美一区二区视频网站| 久久天堂av综合合色蜜桃网| 欧美国产丝袜视频| 一区二区三区国产豹纹内裤在线| 视频一区视频二区中文| 国产精品1区2区3区在线观看| a美女胸又www黄视频久久| 欧美性大战久久久| 欧美videos中文字幕| 国产欧美日产一区| 午夜av区久久| 国产成人av自拍| 欧美日韩电影一区| 国产丝袜美腿一区二区三区| 又紧又大又爽精品一区二区| 九九视频精品免费| 欧洲av一区二区嗯嗯嗯啊| 26uuu亚洲综合色欧美| 亚洲丝袜精品丝袜在线| 久久99国产精品麻豆| 99国产欧美久久久精品| 欧美美女网站色| 国产精品三级电影| 免费日韩伦理电影| 色哟哟精品一区| 久久精品视频一区二区三区| 悠悠色在线精品| 成人午夜又粗又硬又大| 欧美精品v国产精品v日韩精品| 国产日韩影视精品| 日日嗨av一区二区三区四区| 91在线小视频| 久久久五月婷婷| 亚洲妇熟xx妇色黄| jlzzjlzz亚洲日本少妇| 精品少妇一区二区三区在线视频| 亚洲免费视频成人| 成人综合在线网站| 精品免费一区二区三区| 亚洲国产日日夜夜| 色噜噜偷拍精品综合在线| 久久一区二区视频| 欧美bbbbb| 这里只有精品99re| 亚洲成人三级小说| 91黄色免费网站| 中文字幕一区二区三区色视频| 国产大陆a不卡| 欧美mv日韩mv国产网站| 免费在线观看日韩欧美| 欧美三级蜜桃2在线观看| 亚洲欧洲av另类| 成人黄色av网站在线| 国产欧美一区视频| 国产精品 日产精品 欧美精品| 欧美一区二区视频在线观看| 亚洲va天堂va国产va久| proumb性欧美在线观看| 国产精品欧美一区二区三区| 久久精品99国产精品| 欧美区一区二区三区| 亚洲午夜精品17c| 欧美午夜宅男影院| 亚洲综合一区在线| 欧美亚州韩日在线看免费版国语版|