Модераторы: Rickert
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Магараджи 
:(
    Опции темы
bip
Дата 15.4.2007, 17:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 61
Регистрация: 15.3.2007

Репутация: нет
Всего: нет



как доказать что на доске 10Х10 невозможно расставить 10 магараджей, так , чтобы они не угрожали друг другу, а 
возможен лишь один вариант с 9-ю магараджами?(магарадж-конь+ферзь)  smile 
PM MAIL ICQ   Вверх
arilou
Дата 18.4.2007, 11:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Великий МунаБудвин
****


Профиль
Группа: Экс. модератор
Сообщений: 2646
Регистрация: 15.7.2004
Где: город-герой Минск

Репутация: 6
Всего: 61



bip, 
M
arilou
причем тут Программирование игр, графики и искусственного интеллекта?



--------------------
user posted imageuser posted image
PM WWW ICQ   Вверх
Ryoga
Дата 18.4.2007, 11:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 262
Регистрация: 20.9.2005

Репутация: 3
Всего: 6



В "Помощи", вроде, похожая тема была... только, вроде, там так никто ничего и не ответил...
З.Ы.: Могу предложить "полный перебор"...  smile 
PM MAIL   Вверх
dereyly
Дата 18.4.2007, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 217
Регистрация: 16.6.2006

Репутация: 2
Всего: 4



Было написано куча материалов о расстоновках ферзей (проблемы поиска решений вроде относятся к ИИ)  поиск в ширину, с отсечением, эвристического поиск, генетические алгоритмы...
(Можно добавить индукцию т.е находим непересекающихся ферзей для 4x4 потом повышаем размерность и добавляем еще ферзя, если не получается то откат на n-1 где выбираем другую расстановку)
 А задача просто решается перебором: генерируются все решения задачи о 10 ферзях... затем ферзь заменяется магараджем и проверяются эти решения

PM MAIL   Вверх
Ryoga
Дата 18.4.2007, 14:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 262
Регистрация: 20.9.2005

Репутация: 3
Всего: 6



Цитата
(Можно добавить индукцию т.е находим непересекающихся ферзей для 4x4 потом повышаем размерность и добавляем еще ферзя, если не получается то откат на n-1 где выбираем другую расстановку)

А можно ли это сделать? Таким образом у нас первоначальный выбор позиций очень ограничен - надо лепить следующего ферзя обязательно близко к предыдущему. А может на самом деле он на другом конце поля должен будет находиться. Как-то это объясняется? Короче, правомерность такого способа вызывает у меня сомнения.
З.Ы.: В любом случае, граждане Модераторы, тему в "Помощь", однозначно. smile
PM MAIL   Вверх
bip
Дата 19.4.2007, 22:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 61
Регистрация: 15.3.2007

Репутация: нет
Всего: нет



Да эта задачка относится к AI ))). 
Код


#include<stdio.h>
#include<conio.h>
#include<iostream.h>
void KON(int &i,int & j, int a[][11])
{
     if (((i-1>=0)&&(i-1<11))&&((j-2>=0)&&(j-2<11)))
          a[i-1][j-2]=1;
     if (((i+1>=0)&&(i+1<11))&&((j-2>=0)&&(j-2<11)))
          a[i+1][j-2]=1;
     if (((i-1>=0)&&(i-1<11))&&((j+2>=0)&&(j+2<11)))
          a[i-1][j+2]=1;
     if (((i+1>=0)&&(i+1<11))&&((j+2>=0)&&(j+2<11)))
          a[i+1][j+2]=1;
     if (((i-2>=0)&&(i-2<11))&&((j-1>=0)&&(j-1<11)))
          a[i-2][j-1]=1;
     if (((i-2>=0)&&(i-2<11))&&((j+1>=0)&&(j+1<11)))
          a[i-2][j+1]=1;
     if (((i+2>=0)&&(i+2<11))&&((j-1>=0)&&(j-1<11)))
          a[i+2][j-1]=1;
     if (((i+2>=0)&&(i+2<11))&&((j+1>=0)&&(j+1<11)))
          a[i+2][j+1]=1;
}
void SLON (int &i,int & j, int a[][11])
{int k1;
     for (k1=0;k1<11;k1++)
          {
                if (((i+k1>0)&&(i+k1<11))&&((j+k1>0)&&(j+k1<11)))
                     a[i+k1][j+k1]=1;
                if (((i-k1>0)&&(i-k1<11))&&((j-k1>0)&&(j-k1<11)))
                     a[i-k1][j-k1]=1;
                if (((i+k1>0)&&(i+k1<11))&&((j-k1>0)&&(j-k1<11)))
                     a[i+k1][j-k1]=1;
                if (((i-k1>0)&&(i-k1<11))&&((j+k1>0)&&(j+k1<11)))
                     a[i-k1][j+k1]=1;
          }
}
void LADIA (int &i,int & j, int a[][11])
{int stroka,stolb;
     for (stolb=1;stolb<11;stolb++)
          a[i][stolb]=1;
     for (stroka=1;stroka<11;stroka++)
          a[stroka][j]=1;
}

void PutFerz(int i,int j, int a[][11], int *num)//{rekursivnaia procedura}
{
     int k=i,l=j;
     (*num)++;
     printf("%d-i ferz: %c %d\n",*num, i+65,j);
     if (*num>=10) return;
     LADIA(i,j,a);
     KON(i,j,a);
     SLON(i,j,a);
     do { if (l>=9)
                {
                     l=0;
                     k++;
                }else l++;

     }while (a[k][l]!=0);
     PutFerz(k,l,a,num);
}

int a[11][11];
int main()
{ clrscr();
     int kol = 0;
     PutFerz(0,0,a,&kol);
     getch();
     return 0;
}


Вот впринципе её решение, но я в нём не уверен т.к. проходит вариант только с 9-ю магараджами. Ваши предложения->>>

Добавлено через 5 минут и 2 секунды
Цитата(arilou @ 18.4.2007,  11:13)
bip,

Не задача в тему, см. Н.Вирта стр 185, 1989 год издания(Научное издание) smile  
PM MAIL ICQ   Вверх
yomilagro
Дата 6.12.2009, 23:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 6.12.2009

Репутация: нет
Всего: нет



Тема, конечно уже старая, но раз уж я сделала, то напишу.
У меня получилось 4 способа разместить 10 магараджей на доске 10*10.

Вот код программы:

Код

#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>
#include <malloc.h>

#define FREE_CELL -1
#define MAGARADJA_CELL 1
#define INACCESSIBLE_CELL 0



struct OnePlacement
{
    int *i;
    int *j;
    int len;
};


struct OnePlacement * Placements;
int Number;

void PrintOnePlacement(struct OnePlacement op)
{
    int i;

    for (i=0; i< op.len; ++i)
    {
        printf("%2d x %2d\n", op.i[i], op.j[i]);
    }
}


/* Считать значение параметра Param из файла======================*/
int ReadParamFromFile(char Param)
{     
    
    int res;
        
    char str[100];
    int len;
    int pos1;
    int pos2;
    int col;
    int j;    
    char* buf ;
   
    FILE* pFile = fopen("D:\\magaradja.in", "r");
    
    res = 10;        
            
    while ( !feof(pFile) ) 
    {   
        fgets(str, 100, pFile);
        len = strlen(str);
        
        if (len > 1)
        {             
            int i = 0;
            
            while (str[i] == ' ' && i<len)  
                ++i;
            
            if (str[i] != '#')
            {
                
                // Если буква с которой начинается строка совпадает с названием параметра.
                // Находим часть, которая после знака равно и преобразуем ее к int
                if (str[i] == Param)
                {
                
                    while (str[i] != '=')  ++i;
                    ++i;                     
                    while (str[i] == ' ')  ++i;
                
                    pos1 = i;
                
                    while (str[i]<='9' && str[i] >= '0') 
                    ++i;
                
                    pos2 = i-1;
                
                    col = pos2-pos1+1;
                                  
                    buf = (char*)calloc(col, sizeof(char));     
                         
                    for (j = 0; j < col; ++j)
                       buf[j] = str[pos1 + j];                       
                   
                    res = atoi(buf);            
                }
                                           
            }             
        }
    }    
      
    fclose(pFile); 
    
    return res;
}
/*================================================================*/


/*================================================================*/
int IsIJInOnePlacement(int i_mag, int j_mag, struct OnePlacement op)
{
    int i, j;    
    int  res;

    if (op.len == NULL) return 0;

    res = 0;
    for (i=0; i < op.len; ++i)
    {
        if ( op.i[i] == i_mag && op.j[i] == j_mag)
            res = 1;
    }

    return res;
}
/*================================================================*/

/*================================================================*/
int IsEqual(struct  OnePlacement op1, struct  OnePlacement op2)
{
    int i, j;

    if (op1.len == NULL) return 0;
    if (op2.len == NULL) return 0;
    if (op1.len <= 0) return 0;
    if (op2.len <= 0) return 0;
    if (op1.len != op2.len) return 0;

    for (i=0; i < op1.len; ++i)
    {
        if ( !IsIJInOnePlacement(op1.i[i], op1.j[i], op2))
            return 0;
    }

    return 1;
}
/*================================================================*/

/*================================================================*/
int IsInThePlacements(struct OnePlacement op)
{
    int i;

    if (op.len == NULL) return 0;
    if (op.len <= 0) return 0;

    for (i=0; i<Number; ++i)
    {
        if (IsEqual(Placements[i], op))
            return 1;
    }

    return 0;
}
/*================================================================*/

/* Записываем в матрицу нули, там где точно нельзя будет поставить
 магараджу, если новая магараджа ставится в ячейку [i_mgr,j_mgr] */
void SetInaccesibleCells(int **Matr, int M, int i_mgr, int j_mgr)
{
int i;
int j;

*(*(Matr +i_mgr) +j_mgr) =  MAGARADJA_CELL;

// вертикальная линия
for (i = 0; i < M; ++i)
{
    if (i  != i_mgr)
    if (*(*(Matr +i) +j_mgr) == FREE_CELL)
        *(*(Matr +i) +j_mgr) = INACCESSIBLE_CELL;
}

// горизонтальная линия
for (j = 0; j < M; ++j)
{
    if (j != j_mgr)
    if ( *(*(Matr +i_mgr) +j) == FREE_CELL)
        *(*(Matr +i_mgr) +j) = INACCESSIBLE_CELL;
}

// параллельно главной диагонали вверх
i = i_mgr-1;
j = j_mgr-1;
while (i>=0 && j>=0)
{
    if ( *(*(Matr +i) +j) == FREE_CELL)
        *(*(Matr +i) +j) = INACCESSIBLE_CELL;
    --i;
    --j;
}

// параллельно главной диагонали вниз
i = i_mgr+1;
j = j_mgr+1;
while (i<M && j<M)
{
    if ( *(*(Matr +i) +j) == FREE_CELL)
        *(*(Matr +i) +j) = INACCESSIBLE_CELL;
    ++i;
    ++j;
}

// параллельно побочной диагонали вверх
i = i_mgr-1;
j = j_mgr+1;
while (i>=0 && j<M)
{
    if ( *(*(Matr +i) +j) == FREE_CELL)
        *(*(Matr +i) +j) = INACCESSIBLE_CELL;
    --i;
    ++j;
}

// параллельно побочной диагонали вниз
i = i_mgr+1;
j = j_mgr-1;
while (i<M && j>=0)
{
    if ( *(*(Matr +i) +j) == FREE_CELL)
        *(*(Matr +i) +j) = INACCESSIBLE_CELL;
    ++i;
    --j;
}

// ход конем
i = i_mgr - 2;
j = j_mgr - 1;
if (i >= 0 && j >= 0)
   if ( *(*(Matr +i) +j) == FREE_CELL)
        *(*(Matr +i) +j) = INACCESSIBLE_CELL;

i = i_mgr - 2;
j = j_mgr + 1;
if (i >= 0 && j < M)
   if ( *(*(Matr +i) +j) == FREE_CELL)
        *(*(Matr +i) +j) = INACCESSIBLE_CELL;

i = i_mgr - 1;
j = j_mgr + 2;
if (i >= 0 && j < M)
   if ( *(*(Matr +i) +j) == FREE_CELL)
        *(*(Matr +i) +j) = INACCESSIBLE_CELL;

i = i_mgr + 1;
j = j_mgr + 2;
if (i < M && j < M)
   if ( *(*(Matr +i) +j) == FREE_CELL)
        *(*(Matr +i) +j) = INACCESSIBLE_CELL;

i = i_mgr + 2;
j = j_mgr + 1;
if (i < M && j < M)
   if ( *(*(Matr +i) +j) == FREE_CELL)
        *(*(Matr +i) +j) = INACCESSIBLE_CELL;

i = i_mgr + 2;
j = j_mgr - 1;
if (i < M && j >= 0)
   if ( *(*(Matr +i) +j) == FREE_CELL)
        *(*(Matr +i) +j) = INACCESSIBLE_CELL;

i = i_mgr + 1;
j = j_mgr - 2;
if (i < M && j >= 0)
   if ( *(*(Matr +i) +j) == FREE_CELL)
        *(*(Matr +i) +j) = INACCESSIBLE_CELL;

i = i_mgr - 1;
j = j_mgr - 2;
if (i >= 0 && j >= 0)
   if ( *(*(Matr +i) +j) == FREE_CELL)
        *(*(Matr +i) +j) = INACCESSIBLE_CELL;

}
/*================================================================*/


/*================================================================*/
void PrintDoska(int** Matr, int M)
{
    int i,j;

    for (i=0; i<M; ++i)
    {
        for (j=0; j<M; ++j)
        {
            printf("%3d", Matr[i][j]);
        }
        printf("\n");
    }
    printf("\n");
}
/*================================================================*/

/*=================================================================*/
int ** NewDoskaCopy(int ** MainDoska, int M)
{
    int ** doska;
    int i,j;

    doska = (int **)calloc(M, sizeof(int));

    for (i=0; i< M ; ++i)
    {
        doska[i] = (int *)calloc(M, sizeof(int));
        for (j=0; j<M; ++j) 
            doska[i][j] = MainDoska[i][j];
    }

    return doska;
}
/*=================================================================*/

/*=================================================================*/
void FindFromPosition(int i_pos, int j_pos, int ** MainDoska, int  num, int K, int M, int *count)
{
int i, j, i1;
int rab;
int ** doska;
struct OnePlacement op;

*count = *count + 1;

rab = 0;

 num = num  +1;
 //printf("%d-i mag: %d %d\n",num, i_pos, j_pos);
 if (num>=K) 
 {
     op.len = num;
     op.i = (int *)calloc(op.len, sizeof(int));
     op.j = (int *)calloc(op.len, sizeof(int));
     i1=0;

     for (i=0;i<M;++i)
     {
         for (j=0;j<M; ++j)
         {
             if (MainDoska[i][j] == MAGARADJA_CELL)
             {
                 op.i[i1] = i;
                 op.j[i1] = j;
                 i1++;
             }
         }
     }

     op.i[i1] = i_pos;
     op.j[i1] = j_pos;

     if (IsInThePlacements(op) == 0)
     {
     
         if (Number == 0 )
         {
             //Placements = (OnePlacement *)calloc(Number, sizeof(op));
             Placements=(struct OnePlacement * )malloc(sizeof(struct OnePlacement));

         }
         else
         {
             Placements = realloc(Placements, (Number+1)*sizeof(struct OnePlacement));
         }
         Placements[Number ].len = op.len;
         Placements[Number].i = (int *)calloc(op.len, sizeof(int));
         Placements[Number].j = (int *)calloc(op.len, sizeof(int));
         for (i=0; i<op.len; ++i) 
         {
             Placements[Number].i[i] = op.i[i];
             Placements[Number].j[i] = op.j[i];
         }

         Number = Number + 1;

         free(op.i);
         free(op.j);

     }

     return;

 }


 SetInaccesibleCells(MainDoska, M, i_pos, j_pos);


 i= i_pos;
 j= j_pos+1;

 while (i < M)
 {
     while (j < M)
     {
         if (MainDoska[i][j]== FREE_CELL)
         {
             doska = NewDoskaCopy(MainDoska, M);
             FindFromPosition(i,j,doska,num, K, M, count);
             free(doska);
         }

         ++j;
     }
     j=0;
     ++i;
 }

 



}
/*=================================================================*/




int main() 
{    
    int i, j, kol;
    int ** Doska;
    int ** Doska1;
    int num;
    int count;    
    int M, K;

    count = 0;

    M = ReadParamFromFile('M');  
    K = ReadParamFromFile('K'); 
    M=10;
    K=10;

    Doska = (int **)calloc(M, sizeof(int));
 
    for (i=0; i< M ; ++i)
    {
        Doska[i] = (int *)calloc(M, sizeof(int));
        for (j=0; j<M; ++j)
        {
            Doska[i][j] = FREE_CELL;
        }
    }

    i=0;
    j=0;

    //PrintDoska(Doska, M);

    num = 0;

    for (i=0; i< M; ++i)
    {
        for (j=0; j<M; ++j)
        {
            Doska1 = NewDoskaCopy(Doska, M);
            FindFromPosition(i,j, Doska1, num, K,M, &count);
        }
    }

    for (i=0; i<Number; ++i)
    {
        PrintOnePlacement(Placements[i]);
        printf("\n");
    }



    getchar();       
    return 1;
}



Вот способы:

 0 x  2
 1 x  5
 2 x  8
 3 x  0
 4 x  3
 5 x  6
 6 x  9
 7 x  1
 8 x  4
 9 x  7

 0 x  3
 1 x  7
 2 x  0
 3 x  4
 4 x  8
 5 x  1
 6 x  5
 7 x  9
 8 x  2
 9 x  6

 0 x  6
 1 x  2
 2 x  9
 3 x  5
 4 x  1
 5 x  8
 6 x  4
 7 x  0
 8 x  7
 9 x  3

 0 x  7
 1 x  4
 2 x  1
 3 x  9
 4 x  6
 5 x  3
 6 x  0
 7 x  8
 8 x  5
 9 x  2




Это сообщение отредактировал(а) yomilagro - 6.12.2009, 23:57
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Программирование игр, графики и искуственного интеллекта"
Rickert

НА ЗЛОБУ ДНЯ: Дорогие посетители, прошу обратить внимание что новые темы касающиеся новых вопросов создаются кнопкой "Новая тема" а не "Ответить"! Любые оффтопиковые вопросы, заданные в текущих тематических темах будут удалены а их авторы, при рецедиве, забанены.

  • Литературу, связанную с программированием графики, обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы связанные с программированием графики и мультимедии на языках С++ и Delphi
  • Вопросы по реализации алгоритмов рассматриваются здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rickert.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Программирование игр, графики и искусственного интеллекта | Следующая тема »


 




[ Время генерации скрипта: 0.0496 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.