這是之前老師上課時出的作業,就是設計一個1A2B的遊戲,其實在上這堂課之前我一直以為1A2B很難寫,等到這堂課上完才知道,不是很難寫,是我這傢伙太宅了,根本不知道1A2B的規則是啥….
所謂的1A2B是一種猜數字遊戲,假設我現在設定答案是1234,然後讓你來猜數字
當你輸入1567的時候,因為有一個數字的位置、答案都正確(1),這時候就是1A0B
當你輸入1256的時候,因為有兩個數字的位置、答案都正確(1、2),這時候就是2A0B
再來解釋B的來源
當你輸入4321時,有4個數字是跟答案一樣的,但是位置錯誤,所以是0A4B
當你輸入4325時,有3個數字是跟答案一樣的,但是位置錯誤,這時候就是0A3B
簡單講A就是位置對、而且是答案的字母有幾個
B則是「有出現在答案裡面」,但是位置錯誤的字母有幾個
維基百科的解釋:http://goo.gl/FvfLq從以上規則來看,我們可以分成計算A跟計算B來寫程式兩個人玩,一方出數字,一方猜。出數字的人要先想好一個沒有重複數字的4位數,不能讓猜的人知道。猜的人就可以開始猜。每猜一個數,出數者就要根據這個數字給出幾A幾B,其中A前面的數字表示位置正確的數的個數,而B前的數字表示數字正確而位置不對的數的個數。
解題說明:
首先在檢查A與B之前,必須先把預定的答案以及使用者猜的數字分成陣列(一個字元一個空間)再來檢查A其實很簡單,大多數人都會寫,就是逐一檢查每一個位置,當同一位置上面,答案相同時,就代表A增加一個,可以寫成
if(x[i]==y[i]){a++;}
/*
x、y陣列存放答案以及使用者的輸入值,i會一直做i++的運算直到大於等於x、y的維度
*/
以上是計算A的邏輯,在來計算B就比較複雜
因為剛剛說B是不同位置、有出現過的數字,所以我們就用類似循序搜尋法的方式,陣列的每一格空間都找看看,如果有遇到相同的數字,而且是出現在不同的位置,則B+1,然後開始執行下一個字母的搜尋
以下是完整的程式碼,我分成A、B兩部分寫,另外我的程式碼寫的比較簡單,用的是數學的方法解題,請先看註解,不然你會看不懂我在寫什麼
專案檔載點:Box.net|4Shared|Dropbox|Google
程式碼:
/*
計算1A2B的程式
演算法不同於一般的字串比對
而是直接以Integer儲值使用者輸入的資料,然後透過除法的運用分寫出每個字
例如:
1234/1000%10=4
1234/100%10=3
1234/10%10=2
*/
#include
#include
using namespace std;
int main(int argc, char *argv[])
{
int x=1234; //被猜的數字
int a=0,b=0; //用來統計A、B數量
int y; //儲存使用者輸入的值
while(x!=y){
a=0;b=0;
cout<<"請輸入你要猜的數字:";
cin>>y;
cout<
