Играта "Бикове и крави" един забавен урок
Бикове и крави е логическа игра за отгатване на цифри. Играта съществува от много десетилетия Играе се от двама противника, като всеки се стреми да отгатне тайното число, намислено от другия. След всеки ход, противникът дава броя на съвпаденията.Играта протича по следния начин:
На лист хартия всеки участник написва своето тайно число. Тайните числа са четирицифрени, като цифрите са от 1 до 9 без нула и не трябва да се повтарят. След това, последователно един след друг, играчите задават въпрос с предположение за числото на противника. Противникът отговаря, като посочва броя на съвпаденията : ако дадена цифра от предположението се съдържа в тайното число и се намира на точното място, тя е „бик“, ако пък е на различно място, е „крава“.
Пример:
Тайно число: 4271
Предположение: 1234
Отговор: „1 бик и 2 крави“. и т.н.
На всеки ход играчите записват предположените числа и отговорите, за да могат да идентифицират цифрите в тайното число на противника.
Първият играч, който открие тайното число на противника, е победител. Тъй като участникът, който започва, има логическо предимство, победителят от предната игра ще играе втори на ход. В някои случаи всеки играч има равен брой ходове, така че, ако първият пръв открие числото на противника, вторият има право на още един ход и ако и той успее, играта завършва наравно.
Целта на играта е да откриете избраното от противника число, с минимален брой въпроси.Това става възможно с компютъра
Задача. Да се състави програма, с която се реализира играта “Бикове и крави”, като играч X е човек застанал зад клавиатурата и си е намислил едно четирицифрено число ,а У е компютърът , който ще открие Вашето число за най-малко ходове .
Алгоритъм:
Броят на всички четирицифрени числа с неповтарящи се цифри е 3024 защото 9*8*7*6=3024. Нека в масив А(3024) се съхранят всички четирицифрени числа. Компютърът избира А(1) за начално число / първото четирицифрено число с различни цифри/.Потребителят отговаря колко бикове и крави има спрямо неговото число.Обхожда се масив А и се оставят само числата които имат брой бикове и брой крави отговарящи на тези зададени от потребителя, а останалите елементи се нулират. Сгъстява се масив А , т.е. премахват се нулите.Новополученият масив А е подмножество на първоначалния. На следващия ход с цел да познае числото компютърът казва А(1) от сгъстения масив и т.н.. Ясно е, че след краен брой подобни операции от масив А ще се получи масив с един единствен елемент –търсеното число на потребителя. На практика се оказва , че брoя на ходовете от страна на компютъра са от 4 до 6 .
Пример:
Ако потрбителят е избрал:1235 , то компютърът познава за 2 хода.
Ако потрбителят е избрал:9876 , то компютърът познава за 6 хода.
Ето ги:
компютърът предлага:1234 и пита колко бика и колко крави
потребителят отговаря: в=0 к=0 първи ход
компютърът предлага:5678 и пита колко бика и колко крави
потребителят отговаря: в=1 к=2 втори ход
компютърът предлага:5769 и пита колко бика и колко крави
потребителят отговаря: в=0 к=3 трети ход
компютърът предлага:6598 и пита колко бика и колко крави
потребителят отговаря: в=0 к=3 четвърти ход
компютърът предлага:8975 и пита колко бика и колко крави
потребителят отговаря: в=1 к=2 пети ход
компютърът предлага:9876 и пита колко бика и колко крави
потребителят отговаря: в=4 к=0 шести ход
Забележка:Кодът е писан за среда на Visual C++.Правя тази забележка , защото средата Borland C++ не подържа тип BOOLEAN / логически тип / по този начин, който е писан кода по-долу.
С малко корекции ще стане.
CODE
На лист хартия всеки участник написва своето тайно число. Тайните числа са четирицифрени, като цифрите са от 1 до 9 без нула и не трябва да се повтарят. След това, последователно един след друг, играчите задават въпрос с предположение за числото на противника. Противникът отговаря, като посочва броя на съвпаденията : ако дадена цифра от предположението се съдържа в тайното число и се намира на точното място, тя е „бик“, ако пък е на различно място, е „крава“.
Пример:
Тайно число: 4271
Предположение: 1234
Отговор: „1 бик и 2 крави“. и т.н.
На всеки ход играчите записват предположените числа и отговорите, за да могат да идентифицират цифрите в тайното число на противника.
Първият играч, който открие тайното число на противника, е победител. Тъй като участникът, който започва, има логическо предимство, победителят от предната игра ще играе втори на ход. В някои случаи всеки играч има равен брой ходове, така че, ако първият пръв открие числото на противника, вторият има право на още един ход и ако и той успее, играта завършва наравно.
Целта на играта е да откриете избраното от противника число, с минимален брой въпроси.Това става възможно с компютъра
Задача. Да се състави програма, с която се реализира играта “Бикове и крави”, като играч X е човек застанал зад клавиатурата и си е намислил едно четирицифрено число ,а У е компютърът , който ще открие Вашето число за най-малко ходове .
Алгоритъм:
Броят на всички четирицифрени числа с неповтарящи се цифри е 3024 защото 9*8*7*6=3024. Нека в масив А(3024) се съхранят всички четирицифрени числа. Компютърът избира А(1) за начално число / първото четирицифрено число с различни цифри/.Потребителят отговаря колко бикове и крави има спрямо неговото число.Обхожда се масив А и се оставят само числата които имат брой бикове и брой крави отговарящи на тези зададени от потребителя, а останалите елементи се нулират. Сгъстява се масив А , т.е. премахват се нулите.Новополученият масив А е подмножество на първоначалния. На следващия ход с цел да познае числото компютърът казва А(1) от сгъстения масив и т.н.. Ясно е, че след краен брой подобни операции от масив А ще се получи масив с един единствен елемент –търсеното число на потребителя. На практика се оказва , че брoя на ходовете от страна на компютъра са от 4 до 6 .
Пример:
Ако потрбителят е избрал:1235 , то компютърът познава за 2 хода.
Ако потрбителят е избрал:9876 , то компютърът познава за 6 хода.
Ето ги:
компютърът предлага:1234 и пита колко бика и колко крави
потребителят отговаря: в=0 к=0 първи ход
компютърът предлага:5678 и пита колко бика и колко крави
потребителят отговаря: в=1 к=2 втори ход
компютърът предлага:5769 и пита колко бика и колко крави
потребителят отговаря: в=0 к=3 трети ход
компютърът предлага:6598 и пита колко бика и колко крави
потребителят отговаря: в=0 к=3 четвърти ход
компютърът предлага:8975 и пита колко бика и колко крави
потребителят отговаря: в=1 к=2 пети ход
компютърът предлага:9876 и пита колко бика и колко крави
потребителят отговаря: в=4 к=0 шести ход
Забележка:Кодът е писан за среда на Visual C++.Правя тази забележка , защото средата Borland C++ не подържа тип BOOLEAN / логически тип / по този начин, който е писан кода по-долу.
С малко корекции ще стане.
CODE
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 | #include<iostream.h> int main() { int a[3024]; int la,b,k; cout<<" Namisli chislo "<<endl; cout<<"________________________________"<<endl; cout<<" START"<<endl; cout<<"________________________________"<<endl; //zarejdane na masiv a s vsichki 4-cifreni chisla int ii,c1,c2,c3,c4; ii = 0; for(c1 = 1;c1<=9;c1++) for (c2 = 1;c2<=9;c2++) if (c2!=c1) for (c3 = 1;c3<=9;c3++) if ((c3 != c1)&&(c3!=c2)) for (c4 = 1;c4<=9;c4++) if ((c4!=c1)&&(c4!=c2)&&(c4!=c3)) { ii++; a[ii] = ((c1 * 10 + c2) * 10 + c3) * 10 + c4; } la = ii;//broi elementi na masiv a do { cout<<"komp izbra : "<<a[1]<<endl; cout<<" ? bika for "<<a[1]<<"=";cin>>b; cout<<" ? krawi for "<<a[1]<<"=";cin>>k; int b1,k1,i; bool bo1,bo2; int a1[4],a2[4]; //masivi a1 i a2 se pazqt cifrite na dvete chisla int i1, j1; int n1,n2;//promenlivi koito pazqt dva elementa ot masiv a for (i=2;i<=la;i++) { n1=a[1]; n2=a[i]; for(i1=1;i1<=4;i1++) { //otdelqne na cifrite na a[1] a1[i1] = n1%10;n1 = n1/10; //otdelqne na cifrite na a[i] a2[i1] = n2%10;n2 = n2/10; } b1= 0; k1= 0;//broi bik i kravi for (i1 = 1;i1<=4;i1++) for (j1 = 1;j1<=4;j1++) if (a1[i1] == a2[j1]) { if (i1 == j1)b1++; else k1++; } bo1=(b!=b1); //razlichen broj bikowe bo2=(k!=k1); //razlichen broj krawi if (bo1||bo2)a[i]=0; /nulirane na tezi chisla } //compres na masiv a int i2,j2; j2 = 0; for (i2 = 2;i2<=la;i2++) if (a[i2]!=0) { j2++; a[j2]=a[i2]; } la = j2; }while(la!=0); if(la==0)cout<<"chisloto e "<<a[1]<<endl; else cout<<"necorektno"<<endl; return 0; } |





