일단 스압이라 죄송합니다 ㅠㅠ 코딩이 굉장히 길어요!
일단 제가 한 코딩은 Knight's tour라는것이에요.
체스말중 하나인 나이트가 움직이는 방법으로 제가 지정한 가로,세로열을 갖는 사각형을 모두 움직일수 있나를 판별하는거에요.
가로는 4로 고정을 시켜놓았고,세로는 4~9까지의 변수를 받고,프로그램을 실행시켜서 이게 가능하다면 경로가 출력이되고,안되면 안된다고 창을 띄우는거에요.제가 여기까지 했는데 도저히 모르겠어서 여기에 질문드려요.....죄송합니다!
여기서 제가 한 방법은 체스말의 나이트가 움직이는방법 8가지를 random함수를 이용해서 랜덤으로 출력시키고(1~8) switch문을이용해 말을 움직이는거에요. 물론 나이트가 체스판을 벗어나면안되니 제한을 정하고,그 제한을 벗어나면 나가지도록 break를 썻어요.
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int** board = NULL;
int main()
{
srand((unsigned)time(NULL));
int currentrow = 1;
int currentcolumn = 0;
int COL = 0;
int i, j;
int ROW = 4;
int count = 1;
int num1;
int num2, num3;
printf("Please enter column:");
scanf_s("%d", &COL);
board = (int**)calloc(ROW, sizeof(int*));
for (i = 0; i < ROW; i++)
{
board[i] = (int*)calloc(COL, sizeof(int));
}
//체스판을 생성한다.
printf("Enter start location [row][col](range:0~ROW/COL-1)\n");
scanf_s("%d %d", ¤trow, ¤tcolumn);
fflush(stdin);
board[currentrow][currentcolumn] = 1;// 체스판의 시작점을 출력하고,시작점의 숫자(1)을 정한다.
while (1)
{
num1 = rand() % 8+1;
switch (num1)
{
if(count == 4 * COL)
{
break;
}
case 8:
if(board[currentrow-2][currentcolumn-1]>0)
{
break;
}
currentrow -= 2;
currentcolumn--;
if (currentrow - 2 < 0 || currentrow - 1 < 0 || currentrow + 2 > 4 || currentrow + 1>4 || currentcolumn - 1<0 || currentcolumn - 2<0 || currentcolumn + 1>COL - 1 || currentcolumn + 2 > COL - 1)
{
break;
}
count++;
break;
case 1:
if(board[currentrow-2][currentcolumn+1]>0)
{
break;
}
currentrow -= 2;
currentcolumn++;
if (currentrow - 2 < 0 || currentrow - 1 < 0 || currentrow + 2 > 4 || currentrow + 1>4 || currentcolumn - 1<0 || currentcolumn - 2<0 || currentcolumn + 1>COL - 1 || currentcolumn + 2 > COL - 1)
{
break;
}
count++;
break;
case 2:
if(board[currentrow-1][currentcolumn+2]>0)
{
break;
}
currentrow--;
currentcolumn += 2;
if (currentrow - 2 < 0 || currentrow - 1 < 0 || currentrow + 2 > 4 || currentrow + 1>4 || currentcolumn - 1<0 || currentcolumn - 2<0 || currentcolumn + 1>COL - 1 || currentcolumn + 2 > COL - 1)
{
break;
}
count++;
break;
case 3:
if(board[currentrow+1][currentcolumn+2]>0)
{
break;
}
currentrow++;
currentcolumn += 2;
if (currentrow - 2 < 0 || currentrow - 1 < 0 || currentrow + 2 > 4 || currentrow + 1>4 || currentcolumn - 1<0 || currentcolumn - 2<0 || currentcolumn + 1>COL - 1 || currentcolumn + 2 > COL - 1)
{
break;
}
count++;
break;
case 4:
if(board[currentrow+2][currentcolumn+1]>0)
{
break;
}
currentrow += 2;
currentcolumn++;
if (currentrow - 2 < 0 || currentrow - 1 < 0 || currentrow + 2 > 4 || currentrow + 1>4 || currentcolumn - 1<0 || currentcolumn - 2<0 || currentcolumn + 1>COL - 1 || currentcolumn + 2 > COL - 1)
{
break;
}
count++;
break;
case 5:
if(board[currentrow+2][currentcolumn-1]>0)
{
break;
}
currentrow += 2;
currentcolumn--;
if (currentrow - 2 < 0 || currentrow - 1 < 0 || currentrow + 2 > 4 || currentrow + 1>4 || currentcolumn - 1<0 || currentcolumn - 2<0 || currentcolumn + 1>COL - 1 || currentcolumn + 2 > COL - 1)
{
break;
}
count++;
break;
case 6:
if(board[currentrow+1][currentcolumn-2]>0)
{
break;
}
currentrow++;
currentcolumn -= 2;
if (currentrow - 2 < 0 || currentrow - 1 < 0 || currentrow + 2 > 4 || currentrow + 1>4 || currentcolumn - 1<0 || currentcolumn - 2<0 || currentcolumn + 1>COL - 1 || currentcolumn + 2 > COL - 1)
{
break;
}
count++;
break;
case 7:
if(board[currentrow-1][currentcolumn-2]>0)
{
break;
}
currentrow--;
currentcolumn -= 2;
if (currentrow - 2 < 0 || currentrow - 1 < 0 || currentrow + 2 > 4 || currentrow + 1>4 || currentcolumn - 1<0 || currentcolumn - 2<0 || currentcolumn + 1>COL - 1 || currentcolumn + 2 > COL - 1)
{
break;
}
count++;
break;
}
} // 랜덤함수를 이용하여 체스판을 계속 움직인다.일정숫자를 다 배열하면 더이상 숫자를 적을필요가 없으므로 반복문을 종료한다.
free(board);
return 0;
for (num2 = 0; num2 < 4; num2++)
{
for (num3 = 0; num3 < COL - 1; num3++)
{
printf("%d ", board[currentrow][currentcolumn]);
}
printf("\n");
} // 체스판이 움직인경로를 출력
}