Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   Задачка-головоломка (https://forum.antichat.xyz/showthread.php?t=54607)

Дикс 28.11.2007 11:03

Задачка-головоломка
 
Вместо того чтобы учить студентов первых-вторых курсов информатике, нам сунули в зубы *censored* учебник какого-то препода, в котором задачки не столько на знание Си, сколько на соответствие уровню умственного развития как минимум Шерлока Холмса или блин Цезаря и кто там самый умный был =\

Ладно, постараюсь всё обьяснить как можно более внятно.

Задача:
Тема: рекурсивный вызов функции.
11. Разместить на шахматной доске максимальное количество слонов и ладей так,
чтобы они не находились друг у друга " под боем" .

Прога должна вернуть количество ладей и слонов, которым удалось уместиться.

Известно что:
- Ладья, не имея ограничений, может передвигаться на любое расстояние по горизонтали и вертикали.

- Слон ходит по диагонали на любое расстояние.


Первое же препятствие в решении задачи: в какой последовательности ставить слонов и ладьи на доску, так чтобы они заняли всё пространство?
По логике - прогоняем все клетки доски и ставим по очереди то ладью, то слона, так чтобы никто никого не мог сбить. Разделения на белых и чёрных тут нет.

Вот что получается:
http://img148.imageshack.us/img148/7275/var1oe1.jpg

Как видите, справа осталось полным полно клеток, куда можно поставить фигуры с сохранением условия.

Как рекурсией обойти и те клетки тоже? =\
Либо надо поменять порядок вставки слонов и ладей, но ведь он вообще нигде не оговорён, как я могу придумывать его? Тогда это уже вообще идиотизм, я не Си изучаю, а шахматы :mad:

И вот код, который я набросал:
Код:

#include <stdio.h>


void count(int x, int y, char model, int doska[8][8]){

for(int i=0; i<8; i++)
        for(int j=0; j<8; j++)
                if(doska[i][j] == 1)
                        printf("shit");

};



void main(){

        int doska[8][8] = {0};
        doska[2][3] = 1;
        int ladja = 0;
        int slon = 0;

        int x = 0;
        int y = 0;
       
        char model = 'l'; // l = ladja, s = slon

    printf("\nBefore counting: \n\n");
        for(int i=0; i<8; i++)
                for(int j=0; j<8; j++){
                                        if(j==0)
                                        printf("\n");
                printf("%d ", doska[i][j]);
                }
    printf("\n\n");

        // start function
        count(0,0,model, doska);
        // end function

    printf("\n---------------------------------------\nAfter counting: \n\n");
        for(i=0; i<8; i++)
                for(int j=0; j<8; j++){
                                        if(j==0)
                                        printf("\n");
                printf("%d ", doska[i][j]);
                }
    printf("\n\nLadja: %d\nSlon: %d\n\n", ladja, slon);


}

мне кажется, надо вызывать функцию рекурсией, поочерёдно задавая её фигуру для вставки, отличную от предыдущей.
Но главная проблема в том, что я не знаю как проверить оставшиеся клетки =\

Ci5 28.11.2007 12:00

Цитата:

Вместо того чтобы учить студентов первых-вторых курсов информатике, нам сунули в зубы *censored* учебник какого-то препода, в котором задачки не столько на знание Си, сколько на соответствие уровню умственного развития как минимум Шерлока Холмса или блин Цезаря и кто там самый умный был =\
ИМХО хороший программист - программист с хорошим нестандартным мышлением.

Дикс 28.11.2007 12:16

2 Ci5
согласен :( тока вот задачу надо решить к зимней сессии

spider-intruder 28.11.2007 13:00

11. Разместить на шахматной доске максимальное количество слонов и ладей так,
чтобы они не находились друг у друга " под боем" .

У тебя на картинке все ладьи под боем - или "под боем" не должны быть слоны с ладьями а друг с другом можно?

Итог задачи это втиснуть как можно больше "каких нибудь фигур" ну т.е. например 18 слонов это более удачная позиция чем 10 слонов и 2 ладьи???

Или кол во слонов и ладей (ладьев :-)) должно быть одинаковым?

Дикс 28.11.2007 13:21

2 spider-intruder
+1 :) я сам озадачен подобными вопросами.

У меня на картинке ни один слон не может побить ни одну ладью и наоборот.
Имхо, надо разместить как можно больше и тех и тех.

fucking аффтар учебника *WALL*

spider-intruder 28.11.2007 13:30

Узнай точно имеет ли право (по условию) тура бить туру ? Или слон слона
Если да тонапиздячб всю доску турами ИЛИ слонами и у ьтя будет ответ 64*0

Если нетто твой рисунок не верен так как тура бьет туру и ставить на 1 линии их нельзя

Мне самому интересно - давай уточни условие и будем писать )))

(это вам не кавычки тулить ;))

spider-intruder 28.11.2007 13:37

Вот что еще заметил (ну это очевидно просто как вариант)

Нельзя размешать 1 фигуру возле другой ближе чем на 2 клетки...ну... т.е.

Так ставить нельзя:

Для туры: Y-тура X- Слон
xxx
xxxxyxxx
xxx
Для слона:
х х
xxx
xyx
xxx
х х

Может сначала разбить поле (иатрицу на подматрицы) 3*3 и как то от этого плясать


ФОРМАТИРОВАНИЕ СДОХЛО! В асю стукни 988686ШЕСТЬ

ZaCo 28.11.2007 13:50

2spider-intruder естественно сумма фигур имеется ввиду, потому что не было введено понятия цены слона и ладьи.
по теме - не вижу ничего сложного. сложность правда будет не просто оценить, потому что сразу сказать сколько вариантов лишних отметает одна фигура не ясно. с другой стороны тк задача расчитана на первокурсников все должно сводиться к "бездумному" перебору, вот примерный псевдокод:
Код:

int pole[8][8];
int pole_temp[8][8];
...
int sum(int num)
{
  int i,j;
  int max=0;

  //bool ok=false;
  for(i=0;i<8;i++)
  for(j=0;j<8;j++)
    if(pole[i][j]==0)
    {
      ok=true;
      memcpy(&pole_temp[0][0], &pole[0][0], sizeof(pole));
      put(i,j,type);
      int s1=sum(num+1);
      memcpy(&pole[0][0], &pole_temp[0][0], sizeof(pole));
      put(i,j,Obratnyi(type)));
      int s2=sum(num+1);
      memcpy(&pole[0][0], &pole_temp[0][0], sizeof(pole));
      if(s2>s1) s1=s2;
      if(max<s1) max=s1;
    }

  //if(!ok) return 0;
  return num+max;
}
...
sum(0);

--
put - ставим фигуру и обозначаем клетки, что под "боем", например -1. Obratnyi - если слон, то ладья и наоборот.
--
2spider-intruder :) это первый курс, не думайте что от вашего "колледжа" или чего там, от вас потребуют сильных мозгов. и еще, можно ставить ближе чем на две клетки, пример:
*SSSSSSS
********
********
********
********
********
********
*SSSSSSS

S - слоны)

spider-intruder 28.11.2007 13:55

Я так понимаю что это лаботаторная 4 задание 10 ;-)
Судя по всему речь идет о том что слоны могут бить слонов но не тур и наоборот. т.е. твоя картинка пока что верна. НУ ИМХО Конечно!

http://forum.ixbt.com/topic.cgi?id=26:37553 - BlackLor (Pell)
НЕ верно сказал! Так не делай.

Твой ответ будет 8 слонов в первой строке и еше нсколько внизу!!! А у тебя надо посчитать максималку того и того... Надо мудрить с квадратами 3*3 кароче в асю )

spider-intruder 28.11.2007 14:05

2Zaco

Я свой универ уже благо закончил N лет назад и уже 2 работы поменял :-)
Мне просто интересна задача :)

>> "сложность правда будет не просто оценить, потому что сразу сказать сколько вариантов лишних отметает одна фигура не ясно"

В том то и дело :)


Время: 19:53