게시판 즐겨찾기
편집
드래그 앤 드롭으로
즐겨찾기 아이콘 위치 수정이 가능합니다.
어흐....c언어 질문좀해도 될까요??(스압)
게시물ID : programmer_3668짧은주소 복사하기
작성자 : taeyeon
추천 : 0
조회수 : 789회
댓글수 : 4개
등록시간 : 2014/05/31 20:41:49
옵션
  • 베스트금지
  • 본인삭제금지
일단 스압이라 죄송합니다 ㅠㅠ 코딩이 굉장히 길어요!
 
일단 제가 한 코딩은 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", &currentrow, &currentcolumn);
 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");
 } // 체스판이 움직인경로를 출력
}
전체 추천리스트 보기
새로운 댓글이 없습니다.
새로운 댓글 확인하기
글쓰기
◀뒤로가기
PC버전
맨위로▲
공지 운영 자료창고 청소년보호