이 영역을 누르면 첫 페이지로 이동
포렌식 & 개발 이야기 - Forensics & Development 블로그의 첫 페이지로 이동

포렌식 & 개발 이야기 - Forensics & Development

페이지 맨 위로 올라가기

포렌식 & 개발 이야기 - Forensics & Development

Pental - Forensics / iOS / Windows / Android / Kakaotalk / Telegram / Etc

[정올] 1106 : 정올

  • 2018.06.13 23:16
  • Programming/C
글 작성자: pental

1106 : 장기

제한시간: 1000 ms    메모리제한: 64 MB
해결횟수: 2486 회    시도횟수: 7584 회   



N×M장기판에 졸 한개와 말 한개가 놓여 있다. 말의 이동 방향이 다음과 같다고 할 때, 말이 최소의 이동횟수로 졸을 잡으려고 한다. 

efc6e5f9d670c6da62174cf11a66a8c2_1449814

 

말이 졸을 잡기 위한 최소 이동 횟수를 구하는 프로그램을 작성해보자.

 

첫 줄은 장기판 행의 수(N)와 열의 수(M)를 받는다.(1≤N, M≤100) 둘째 줄은 말이 있는 위치의 행(R), 열(C)의 수와 졸이 있는 위치의 행(S), 열(K)의 수를 입력받는다. 단, 장기판의 제일 왼쪽 위의 위치가 (1,1)이다. 각 행과 열은 R(1≤R≤N), C(1≤C≤M), S(1≤S≤N), K(1≤K≤M)이다.



말이 졸을 잡기 위한 최소 이동 횟수를 출력한다.


9 9
3 5 2 8
2

출처 : jungol


[소스코드] 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
/* 1106.c */
 
#include <stdio.h>
typedef struct {
    int y; // 세로
    int x; // 가로
    int idx; // 확장변수 (temp)
} _alpha; // Location
_alpha ALPHA[1000000]; // Location 100000000
int  main()
{
    int y = 0; // 세로
    int x = 0; // 가로
    int horse_y = 0; // 말의 세로
    int horse_x = 0; // 말의 가로
    int army_y = 0; // 쫄병
    int army_x = 0; // 쫄병
    
    scanf("%d %d", &y, &x); // 행과 열을 입력받음 (가로 세로를 입력)
    scanf("%d %d", &horse_y, &horse_x); // 말의 가로와 세로를 입력
    scanf("%d %d", &army_y, &army_x); // 쫄병의 가로와 세로를 입력
    
    int head = 0; // 머리
    int tail = 1; // 꼬리
    int Dy[] = { 2, 1, -1, -2, 2, 1, -1, -2 }; // 좌표값 세로
    int Dx[] = { -1, -2, -2, -1, 1, 2, 2, 1 }; // 좌표값 가로
    int map[102][102] = { 0, }; // 맵
    int tmp_y = 0; // 임시 세로
    int tmp_x = 0; // 임시 가로
 
    ALPHA[0].y = horse_y; // 말의 위치를 옮김 세로
    ALPHA[0].x = horse_x; // 말의 위치를 옮김 가로
    ALPHA[0].idx = 0; // 확장변수 (temp)
    
    int i;
    while (1)
    {
        for (i = 0; i < 8; i++)
        {
            tmp_y = ALPHA[head].y + Dy[i]; // 임시좌표에 지정된 좌표값을 더해서 저장 세로
            tmp_x = ALPHA[head].x + Dx[i]; // 임시좌표에 지정된 좌표값을 더해서 저장 가로
            if (tmp_y >= 1 && tmp_y<= y && tmp_x >= 1 && tmp_x <= x) // 임시좌표값이 1보다 크거나 같으면
            {
                if (map[tmp_y][tmp_x] == 0) // 맵의 세로와 가로가 0이면
                {
                    if (tmp_x == army_x && tmp_y == army_y) // 임시 가로와 세로의 값이 쫄병의 위치와 같으면
                    {
                        printf("%d\n", ALPHA[head].idx + 1); // 말의 머리를 출력
                        return 0;
                    }
                    ALPHA[tail].y = tmp_y;
                    ALPHA[tail].x = tmp_x;
                    ALPHA[tail].idx = ALPHA[head].idx + 1;
                    tail++;
                    map[tmp_y][tmp_x] = 1;
                }
            }
        }
        head++;
    }
    return 0;
}
Colored by Color Scripter
cs


저작자표시 (새창열림)

'Programming > C' 카테고리의 다른 글

[정올] 530 : 선택제어문 - 자가진단3  (0) 2019.11.21
[정올] 529 : 선택제어문 - 자가진단2  (0) 2019.11.21
[정올] 528 : 선택제어문 - 자가진단1  (0) 2019.11.21
[정올] 1060 : 최소비용신장트리  (0) 2018.06.13
[정올] 1331 : 문자마름모  (0) 2017.08.12

댓글

이 글 공유하기

  • 구독하기

    구독하기

  • 카카오톡

    카카오톡

  • 라인

    라인

  • 트위터

    트위터

  • Facebook

    Facebook

  • 카카오스토리

    카카오스토리

  • 밴드

    밴드

  • 네이버 블로그

    네이버 블로그

  • Pocket

    Pocket

  • Evernote

    Evernote

다른 글

  • [정올] 529 : 선택제어문 - 자가진단2

    [정올] 529 : 선택제어문 - 자가진단2

    2019.11.21
  • [정올] 528 : 선택제어문 - 자가진단1

    [정올] 528 : 선택제어문 - 자가진단1

    2019.11.21
  • [정올] 1060 : 최소비용신장트리

    [정올] 1060 : 최소비용신장트리

    2018.06.13
  • [정올] 1331 : 문자마름모

    [정올] 1331 : 문자마름모

    2017.08.12
다른 글 더 둘러보기

정보

포렌식 & 개발 이야기 - Forensics & Development 블로그의 첫 페이지로 이동

포렌식 & 개발 이야기 - Forensics & Development

  • 포렌식 & 개발 이야기 - Forensics & Development의 첫 페이지로 이동

검색

메뉴

  • 홈
  • 태그
  • 미디어로그
  • 위치로그
  • 방명록

카테고리

  • Category (452)
    • Forensics (105)
      • Magnet AXIOM (28)
      • Digital Forensics Informati.. (9)
      • Iphone Forensics (24)
      • DFC (7)
      • 디지털포렌식전문가2급 자격증 (10)
      • FTK ACE 자격증 (7)
    • 이것저것 (7)
      • Ubuntu (6)
      • 디스코드 봇 (4)
      • Volatility GUI (2)
    • CTF (32)
      • NEWSECU (14)
      • CTF-d (5)
      • Puzzel - Network Forensics (2)
      • Security Traps (2)
      • system32.kr (5)
      • HMCTF (4)
    • Programming (260)
      • C (10)
      • Python (11)
      • 백준 (206)
      • 프로그래머스 (32)
    • 그냥 개발 및 잡담 (16)
      • Docker (2)
      • Google Cloud (3)
      • OS 개발 (3)
    • Best of Best (20)

최근 글

인기 글

댓글

공지사항

아카이브

태그

  • 디지털포렌식
  • 포렌식
  • 프로그래머스
  • pental
  • axiom
  • 파이썬
  • 백준
  • Forensics
  • 전체 보기…

정보

pental의 포렌식 & 개발 이야기 - Forensics & Development

포렌식 & 개발 이야기 - Forensics & Development

pental

블로그 구독하기

  • 구독하기
  • RSS 피드

방문자

  • 전체 방문자
  • 오늘
  • 어제

티스토리

  • 티스토리 홈
  • 이 블로그 관리하기
  • 글쓰기
Powered by Tistory / Kakao. Copyright © pental.

티스토리툴바