Logo Море(!) аналитической информации!
IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware
Архив форумов ЦИТФорума
Море(!) вопросов - Море(!) ответов
 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 
Как правильно задавать вопросы

Ваше мнение

 
Перейти:  
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Обучение
Предыдущая тема :: Следующая тема  
Автор Сообщение
Leksus



Зарегистрирован: 12.01.2005
Сообщения: 4

СообщениеДобавлено: Вт Мар 08 2005 22:32    Заголовок сообщения: Ваше мнение Ответить с цитатой

Ваши замечания присылайте по адресу Leksus83@netman.ru
/* программа обхода шахматной доски конем с использованием эвристики
Конь обходит пустую шахматную доску побывав в каждой клетке только один раз
по завершению каждого обхода начинается следующий обход но с другой клетки */
Код:
#include<stdio.h>

int CheckAcces(const int,int,const int[][8],const int [][8], const int,const int, const int,const int, const int[],const int[]);
int virtStep(int,int,int[][8],int[][8],int[],const int[], const int[] );
int check(const int,const int,const int,const int[],const int[],const int[][8]);
void PrintfArray(const int[][8]);/*выводит на экран массив*/
void ModifyArray(int[][8], const int[][8],const int[],const int[]);/*модификация массива показателей досттупности шахматных клеток*/

int main(){
int currentRow=0,currentColumn=0; /*текущее положение коня на шахматной доске*/

int accessibility[8][8]={0}; /* массив показателей доступности клеток*/
const int horizontal[8]={ 2, 1,-1,-2,-2,-1,1,2}; /*перемещение коня по горизонтали*/
const int vertical[8]= {-1,-2,-2,-1, 1, 2,2,1}; /*перемещение коня по вертикали*/

for(int CR=0;CR<=7;CR++)for(int CC=0;CC<=7;CC++){/* начало обхода конем из различных клеток*/
int board[8][8]={0};/*шахматная доска, инициализированна нулями*/

currentRow=CR;/* присвоение следующего начального положения коня*/
currentColumn=CC;

printf("currentRow=%d;currentColumn%d;\n", currentRow, currentColumn);
for(int i=1;i<=64;i++){
if(i==1){board[currentRow][currentColumn]=1;continue;}
ModifyArray(accessibility, board, horizontal, vertical); //модификация показателей доступности клеток,он равен количеству клеток из которых доступна эта клетка
//if(i<10/*||i==63||i==60*/){PrintfArray(accessibility);PrintfArray(board);printf("currentRow=%d;currentColumn%d;\n", currentRow, currentColumn);}// выводит первоночальное состояние показателей доступности клеток до начала обхода

int first=0,midlRow,midlColumn;
for(int move=0;move<=7;move++){// перебор возможных ходов
if(check(move,currentRow,currentColumn,horizontal, vertical,board)) {

if(first==0){midlRow=currentRow+horizontal[move];midlColumn=currentColumn+vertic
al[move];first=1;continue;}
if(CheckAcces(i,move,accessibility,board,midlRow,midlColumn,currentRow,currentCo
lumn,horizontal,vertical)){midlRow=currentRow+horizontal[move];midlColumn=curren
tColumn+vertical[move];}



} }

currentRow=midlRow;
currentColumn=midlColumn;

//printf("step=%d; currentRow=%d;currentColumn=%d; ", i, currentRow,currentColumn);
//printf("accessibility[%d][%d]=%d\n\n", currentRow,currentColumn,accessibility[currentRow][currentColumn]);
if( board[currentRow][currentColumn]!=0)break;
else{ board[currentRow][currentColumn]=i;
/*printf("BAS array modification\n"); PrintfArray(board);*/}



}

printf("\n");
PrintfArray(board);
int eror=0;
for(int r=0;r<=7;r++)for(int c=0;c<=7;c++)if(board[r][c]==0)eror++;
if(eror>0){printf(" steps are not complit start point is [%d][%d]\n", CR,CC);
getchar();
getchar();
}
else printf("Ok\n");
printf("\n\n\n");
//PrintfArray(accessibility);
}
getchar();
getchar();
}

void PrintfArray(const int a[][8]){
printf("\n");
for(int i=0;i<=7;i++){
for(int j=0;j<=7;j++)
printf("%-2d ",a[i][j]);
printf("\n");
}
printf("\n");
//getchar();
//getchar();
}
//////////////////////////////////////////////////////////////////////////////////////////////////////
void ModifyArray(int acces[][8],const int Board[][8],const int Horizontal[],const int Vertical[])
{
//printf("In function of modification");
for(int i=0;i<=7;i++)for(int j=0;j<=7;j++)acces[i][j]=0;
//PrintfArray(acces);
//PrintfArray(Board);
for(int CRow=0;CRow<=7;CRow++)for(int CCol=0;CCol<=7;CCol++)
if(Board[CRow][CCol]==0)
for(int move=0;move<=7;move++)
if(check(move,CRow,CCol,Horizontal,Vertical,Board))acces[CRow][CCol]++;

//PrintfArray(acces);
}

//////////////////////////////////////////////////////////////////////////////////////////////////////

int check(const int m,const int CR,const int CC,const int Hor[],const int Ver[],const int B[][8]){

if(((8>(CC+Ver[m]))&&(8>(CR+Hor[m])))&&(((CR+Hor[m])>=0)&&((CC+Ver[m])>=0))&&(B[CR+Hor[m]][CC+Ver[m]]==0))return 1;
else return 0;

}

////////////////////////////////////////////////////////////////////////////////////////////////////////
int CheckAcces(int const n,int m,const int acc[][8],const int bOARD[][8], const int mr,const int mc, const int cr,const int cc, const int horiz[],const int vert[]){

if(acc[mr][mc]==acc[cr+horiz[m]][cc+vert[m]]){
int CrAndCc[2]={cr+horiz[m],cc+vert[m]},MrAndMc[2]={mr,mc};
int MrMc=1,CrCc=0;
int CAcc[8][8],CBOARD[8][8],MAcc[8][8],MBOARD[8][8];
for(int i=0;i<=7;i++)for(int j=0;j<=7;j++)CAcc[i][j]=0;
for(int i=0;i<=7;i++)for(int j=0;j<=7;j++)MAcc[i][j]=0;
for(int i=0;i<=7;i++)for(int j=0;j<=7;j++)CBOARD[i][j]=bOARD[i][j];
for(int i=0;i<=7;i++)for(int j=0;j<=7;j++)MBOARD[i][j]=bOARD[i][j];
int M=acc[mr][mc],C=acc[cr+horiz[m]][cc+vert[m]];
/* printf("Befor :M=%d [%d][%d] C=%d [%d][%d] Step=0 \n",M,mr,mc,C,cr+horiz[m],cc+vert[m]);
printf("////////////////////////CURENT COPY////////////////////////\n//////////////////////////");
PrintfArray(CBOARD);
PrintfArray(CAcc);
printf("////////////////////////MIDL COPY//////////////////////////");
PrintfArray(MBOARD);
PrintfArray(MAcc);
getchar();
getchar();
*/
//printf("Befor :M=%d [%d][%d] C=%d [%d][%d] Step=0 \n",M,mr,mc,C,cr+horiz[m],cc+vert[m]);

int step=0, first=1;
for(int g=n;g<=n+2;g++){
if(first){
MBOARD[MrAndMc[0]][MrAndMc[1]]=g;
CBOARD[CrAndCc[0]][CrAndCc[1]]=g;
//printf("MODIFY\n");
ModifyArray(CAcc,CBOARD , horiz, vert);
ModifyArray(MAcc, MBOARD, horiz, vert);
first=0;
continue;}
/*
printf("////////////////////////CURENT afte step has being don////////////////////////\n//////////////////////////");
PrintfArray(CBOARD);
PrintfArray(CAcc);
printf("////////////////////////MIDL afte step has being don//////////////////////////");
PrintfArray(MBOARD);
PrintfArray(MAcc);
getchar();
getchar();*/
M=virtStep(MrMc,g,MAcc,MBOARD,MrAndMc,horiz,vert);
//printf(" After :M=%d [%d][%d];C=%d [%d][%d]; Step=%d\n",M,MrAndMc[0],MrAndMc[1],C,CrAndCc[0],CrAndCc[1],step);
//getchar();
//getchar();
C=virtStep(CrCc,g,CAcc,CBOARD,CrAndCc,horiz,vert);
//printf(" After :M=%d [%d][%d];C=%d [%d][%d]; Step=%d\n",M,MrAndMc[0],MrAndMc[1],C,CrAndCc[0],CrAndCc[1],step);
//getchar();
//getchar();
if(M>C)return 1;
if(M==C==0)return 0;
if((M==C)&&(g==g+n))return 0;
if(M<C)return 0;
}
}

if(acc[mr][mc]>acc[cr+horiz[m]][cc+vert[m]])return 1;
else return 0;
}

/////////////////////////////////////////////////////////////////////////////////////////////////////////
int virtStep(int ch,int n,int ACC[][8],int Desk[][8],int CRandCC[],const int h[],const int v[]){
int first=0,mR=0,mC=0;

ModifyArray(ACC, Desk, h, v);
//if(ch==0)printf(" CURENT in \n");
//if(ch==1)printf(" MIDL in \n");
//PrintfArray(Desk);
//PrintfArray(ACC);

for(int move=0;move<=7;move++){// перебор возможных ходов

if(check(move,CRandCC[0],CRandCC[1],h,v,Desk)){
if(first==0){mR=CRandCC[0]+h[move];mC=CRandCC[1]+v[move];first=1;continue;}
//printf("mR=%d;mC=%d; CRandCC[0]+h[move]=%d;CRandCC[1]+v[move]=%d;\n",mR,mC,CRandCC[0]+h[move],CRandCC[1]+v[move]);
if(ACC[mR][mC]& gt;ACC[CRandCC[0]+h[move]][CRandCC[1]+v[move]]){mR=CRandCC[0]+h[move];mC=CRandCC
[1]+v[move];}
}
}
/*if(ch==0)printf(" CURENT \n");
if(ch==1)printf(" MIDL \n");*/
//printf("mR=%d; mC=%d;\n", mR, mC);
//printf("Befor CRAndCC[0]=%d,CRndCC[1]=%d\n",CRandCC[0],CRandCC[1]);
CRandCC[0]=mR;
CRandCC[1]=mC;
// printf("After CRAndCC[0]=%d,CRndCC[1]=%d\n",CRandCC[0],CRandCC[1]);

if( Desk[mR][mC]!=0)return 0;
else Desk[mR][mC]=n;

//if(ch==0)printf(" CURENT in func \n");
//if(ch==1)printf(" MIDL in func \n");
//PrintfArray(Desk);
//PrintfArray(ACC);

return ACC[mR][mC];





}
////////////////////////////////////////////////////////////////////////////////////////////////////////
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
Показать сообщения:   
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Обучение Часовой пояс: GMT + 3
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Powered by phpBB © 2001, 2002 phpBB Group
Русская поддержка phpBB

 

IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware

Информация для рекламодателей PR-акции, размещение рекламы — adv@citforum.ru,
тел. +7 495 6608306, ICQ 232284597
Пресс-релизы — pr@citforum.ru
Послать комментарий
Информация для авторов
This Web server launched on February 24, 1997
Copyright © 1997-2000 CIT, © 2001-2006 CIT Forum
Внимание! Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. Подробнее...