초기 노드를 랜덤하게 생성.
목적 노드도 적용했고,
랜덤 생성된 노드를 목적 노드로 언덕 등반 탐색으로 탐색을 합니다.
언덕 등반으로 탐색하면서
평원, 국부 최대, 해를 구할 수 있으며,
몇 번의 실행으로 해가 나와야 하는데.. 에러는없는데.. 왜 실행이 안됄까요...
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void readData(int data[][5]);
void printPuz(int data[][5]);
void swap(int *dest, int *zero);
void formatArray(int dataArray[][5]);
int compare(int data1[][5],int data2[][5]);
void copyData(int oData[][5], int dData[][5]);
void searchVestValue(int data[][5], int sort[][5]);
void findZero(int data[][5]);
struct Position{
int x;
int y;
} position;
void main()
{
int inputData[5][5], sortData[5][5];
readData(inputData);
printf("-------원본 값--------------------\n");
printPuz(inputData);
// readData(sortData);
formatArray(sortData);
sortData[1][1] =1;
sortData[1][2] =2;
sortData[1][3] =3;
sortData[2][1] =8;
sortData[2][2] =0;
sortData[2][3] =4;
sortData[3][1] =7;
sortData[3][2] =6;
sortData[3][3] =5;
printf("-------목적 값--------------------\n");
printPuz(sortData);
printf("----------------------------------\n");
searchVestValue(inputData, sortData);
}
void searchVestValue(int inputData[][5], int sort[][5]){
// int i, j,
int bestResult, compareResult, localMax;
int tmp[5][5], data[5][5], best[5][5];
bestResult=0;
compareResult=0;
copyData(inputData, best);
printPuz(best);
printf("compare=%d\n",compare(best,sort));
while(1){
printf("----------------------------------\n");
localMax = bestResult;
copyData(best, data);
copyData(data, tmp);
findZero(data);
printf("\nZERO POINT: x=%d y=%d\n", position.x, position.y);
printf("MOVE 1\n");
if(data[position.x][position.y-1] !=9){
swap(&data[position.x][position.y-1],&data[position.x][position.y]);
compareResult = compare(sort,data);
if(8 == compareResult){
copyData(data,best);
bestResult = compareResult;
break;
}else if(bestResult < compareResult){
copyData(data,best);
bestResult = compareResult;
}
printf("compareResult=%d\n",compareResult);
printPuz(data);
copyData(tmp, data);
}
/* -------------------------------------------------------------------*/
printf("MOVE 2\n");
if(data[position.x][position.y+1] !=9){
swap(&data[position.x][position.y+1],&data[position.x][position.y]);
compareResult = compare(sort,data);
if(8 == compareResult){
copyData(data,best);
bestResult = compareResult;
break;
}else if(bestResult < compareResult){
copyData(data,best);
bestResult = compareResult;
}
printf("compareResult=%d\n",compareResult);
printPuz(data);
copyData(tmp, data);
}
/* -------------------------------------------------------------------*/
printf("MOVE 3\n");
if(data[position.x-1][position.y] !=9){
swap(&data[position.x-1][position.y],&data[position.x][position.y]);
compareResult = compare(sort,data);
if(8 == compareResult){
copyData(data,best);
bestResult = compareResult;
break;
}else if(bestResult < compareResult){
copyData(data,best);
bestResult = compareResult;
}
printf("compareResult=%d\n",compareResult);
printPuz(data);
copyData(tmp, data);
}
/* -------------------------------------------------------------------*/
printf("MOVE 4\n");
if(data[position.x+1][position.y] !=9){
swap(&data[position.x+1][position.y],&data[position.x][position.y]);
compareResult = compare(sort,data);
if(8 == compareResult){
copyData(data,best);
bestResult = compareResult;
break;
}else if(bestResult < compareResult){
copyData(data,best);
}
printf("compareResult=%d\n",compareResult);
printPuz(data);
}
/* -------------------------------------------------------------------*/
if(localMax >= bestResult ) break;
}
if(localMax >= bestResult ){
printf("\n%d %d", localMax, bestResult);
printf(" Lacal Maximum \n");
}else{
printf("Final compareResult=%d\n",compareResult);
printPuz(best);
}
}
void findZero(int data[][5])
{
int i, j;
for(i=1; i< 4 ; i++)
{
for(j=1 ; j<4 ; j++)
{
if(data[i][j] == 0)
{
position.x = i;
position.y = j;
break;
}
}
}
}
int compare(int data1[][5],int data2[][5]){
int counter=0;
int i,j;
for(i = 0 ; i < 5 ; i++){
for(j=0 ; j < 5 ; j++){
if(data1[i][j] == data2[i][j]){
if(data1[i][j] == 0 && data2[i][j]==0)
continue;
counter++;
}
}
}
return counter-16;
}
void copyData(int Data1[][5], int Data2[][5]){
int i, j;
formatArray(Data2);
for(i=1; i< 4 ; i++){
for(j=1 ; j<4 ; j++){
Data2[i][j] = Data1[i][j];
}
}
}
void swap(int *dest, int *zero){
int tmp = *dest;
*dest = *zero;
*zero = tmp;
}
void readData(int data[][5]){
int flag[9]={-1,-1,-1,-1,-1,-1,-1,-1,-1};
int tmp, r,c;
int i=0;
int num[9];
formatArray(data);
while(i <9){
tmp =rand()%9+1;
if(flag[tmp] < 0){
num[i] = tmp;
flag[tmp] =1 ;
i++;
}
}
for(i=0; i<9;i++){
printf("%d-", num[i]);
}
printf("\n");
i=0;
for(r=1 ; r < 4 ; r++){
for(c = 1 ; c < 4 ; c++){
data[r][c] = num[i];
i++;
}
}
}
/*
void readData(int data[][5]){
FILE *fp;
data[r][c] = num[i];
i--;
}
}
}
/*
void readData(int data[][5]){
FILE *fp;
int tmp;
int r,c;
char fileName[20];
printf("\ninput Data file name => ");
fflush(stdin);
gets(fileName);
if( ( fp = fopen(fileName, "r") ) == NULL ){
printf("this file is not find\n");
exit(1);
}
formatArray(data);
for(r=1 ; r < 4 ; r++){
for(c = 1 ; c < 4 ; c++){
fscanf(fp, "%d", &tmp);
data[r][c] = tmp;
}
}
fclose(fp);
} */
void printPuz(int data[][5]){
int r,c;
for(r=1 ; r < 4 ; r++){
for(c = 1 ; c < 4 ; c++){
printf("%d ",data[r][c]);
}
printf("\n");
}
}
void formatArray(int dataArray[][5]){
int r,c;
for(r=0 ; r < 5 ; r++){
for(c = 0 ; c < 5 ; c++){
dataArray[r][c] = 9;
}
}
}
|