PDA

View Full Version : Бикове и крави С++, проблем



Chacho
02-24-2011, 13:39
Опитвам се да направя бикове и крави на С++, така че да се играе срещу компютъра и той да е достоен противник. Успях да направя частта с въвеждането на число на играча, генерирането на число на компютъра и познаването на числото на компютъра. След това се захванах да пиша алгоритъма на бота, но сигурно нещо не съм написал като хората и сега ми гърми почти цялата програма. Ако на някой му се занимава да погледне кода, ще му го пратя. (дългичък е и, макар че има коментари, е малко труден за следене)

Ще напиша алгоритъма, ако някой се навие да го реализира. Струва ми се, че е верен. Ето го:

Алгоритъм на бота:

1. Проверява дали в 1234 има бикове или крави. Ако има, отива на стъпка 2, иначе на стъпка 10.

2. Докато броят на биковете е различен от броят на биковете и кравите (бикове != бикове + крави) пермутира 1234 и запаметява последната пермутация числото.

3. Проверява дали в 5678 има бикове и крави. Ако има, отива на стъпка 4, иначе отива на стъпка 9.

4. Докато броят на биковете е различен от броят на биковете и кравите (бикове != бикове + крави) пермутира 5678 и запаметява последната пермутация на числото.

5. Ако сборът от биковете и кравите в пермутираните 1234 и 5678 е по-малък от 4 (с други думи 9-ката е крава), то отива на стъпка 6, иначе на стъпка 8.

6. В запаметеното 1234 разменя цифрите с 9-ката и:
-Ако при сменянето на цифрата намалеят биковете, тогава ги разменя отново, за да върне старото
-Ако при сменянето на цифрата се запазят биковете (с други думи 9-ката не е бик, нито е върху друг бик), то запазва индексът на дадената цифра и отново разменя цифрата и 9-ката за да върне старата.
-Ако при сменянето нарастнат биковете, запаметява числото.
Стъпката се изпълнява, докато 9-ката не се размени със всички 4 цифри, по този начин сме намерили мястото й и местата, където трябва да се поставят биковете от 5678.

7. Разменя цифрите от запаметеното 5678 с индекси запазените от 6 на с цифрите със същите индекси от запаметеното 1234 (вече със сложена 9-ка). Полученото число има 4 бика.

8. 9-ката не е бик, затова правим сходна на 6 стъпка, използвайки 9-ката да проверим индексите на цифрите в 1234, на които няма бикове. След това правим стъпка 7.

9. Изпълнява същото като в стъпка 6, но без да пази индекси.

10. Докато (бикове != бикове+крави) пермутира 5678 и после стъпка 9, но за числото 5678.


Първо се въвежда число от опонента и компютърът генерира свое. В един масив се записват всички ходове на компютърът, преди да е започнала самата игра. Като започне играта, на всеки свой ход компютърът извежда поредното число от масива с ходове. Играта свършва, когато някой първи познае числото на опонента си.


Ето и алгоритъм за пермутация на число:
Нека Razm(x,y) e функция, която разменя числата х и у, а а[4] e масивът с цифрите от числото.

for (i=0; i<n; i++)
{
for (j=0; j<n; j++)
{
//kod za zapisvane na a[0] до a[3] в друг масив
Razm(a[3], a[2]);
//kod za zapisvane na a[0] do a[3] в друг масив
Razm(a[2], a[1]);
}
Razm(a[1], a[0]);
}


Очаквам на никого да не му се занимава, но все пак, ако някой се захване, благодаря предварително!

Foreverbg
02-24-2011, 13:48
Я си дай скайпа на лично, че тука не ми се пише :D Ще се опитам да ти помогна, обаче имам няколко въпроса. :P

casic
02-23-2013, 08:48
Намери ли решение . Това ли е най оптималния алгоритъм ? Доколкото разбрах , максимума е 10 стъпки.