jungol:problem_2074
마방진 - 문제 번호 2074
링크: http://www.jungol.co.kr/bbs/board.php?bo_table=pbank&wr_id=1338&sca=20#none
#include <stdio.h> int read_n(); void show_magic_square(int n); void doTests(); void assert_equal(int expected, int actual); int get_start(int n); int get_next_point_for_x(int x, int current, int n); int get_next_point_for_y(int y, int current, int n); int board[100][100]; void init_board(int (*board)[100], int n); void print_board(int (*board)[100], int n); int main(int argc, char* argv[]) { int i = 0; i = read_n(); show_magic_square(i); doTests(); printf("argc: %d, argv: %s\n", argc, argv[0]); return 0; } int read_n() { int temp = 0; scanf("%d", &temp); return temp; } void show_magic_square(int n) { int i = 0; int number = 1; int x = 0; int y = 0; int number_of_loop = n * n; init_board(board, n); x = get_start(n); for (i = 0; i < number_of_loop; i++) { board[y][x] = number; x = get_next_point_for_x(x, number, n); y = get_next_point_for_y(y, number, n); number = number + 1; } print_board(board, n); } void init_board(int (*board)[100], int n) { int i = 0; int j = 0; for (i = 0; i < n; i++) { for (j = 0; j < n; j++) { board[i][j] = 0; } } } void print_board(int (*board)[100], int n) { int i = 0; int j = 0; for (i = 0; i < n; i++) { for (j = 0; j < n; j++) { printf("%d ", board[i][j]); } printf("\n"); } } void doTests() { assert_equal(1, get_start(3)); assert_equal(2, get_start(5)); assert_equal(3, get_start(7)); assert_equal(4, get_start(9)); assert_equal(0, get_next_point_for_x(1, 1, 3)); // current of x, last number, n assert_equal(2, get_next_point_for_y(0, 1, 3)); // current of y, last number, n assert_equal(2, get_next_point_for_x(0, 2, 3)); assert_equal(1, get_next_point_for_y(2, 2, 3)); assert_equal(2, get_next_point_for_x(2, 3, 3)); assert_equal(2, get_next_point_for_y(1, 3, 3)); assert_equal(1, get_next_point_for_x(2, 4, 3)); assert_equal(1, get_next_point_for_y(2, 4, 3)); assert_equal(0, get_next_point_for_x(1, 5, 3)); assert_equal(0, get_next_point_for_y(1, 5, 3)); assert_equal(0, get_next_point_for_x(0, 6, 3)); assert_equal(1, get_next_point_for_y(0, 6, 3)); assert_equal(2, get_next_point_for_x(0, 7, 3)); assert_equal(0, get_next_point_for_y(1, 7, 3)); assert_equal(1, get_next_point_for_x(2, 8, 3)); assert_equal(2, get_next_point_for_y(0, 8, 3)); printf("Done\n"); } int get_next_point_for_x(int x, int current, int n) { int temp_x = x; if (current % n == 0) { return temp_x; } temp_x = temp_x - 1; if (temp_x < 0) { temp_x = n - 1; } return temp_x; } int get_next_point_for_y(int y, int current, int n) { int temp_y = y; if (current % n == 0) { temp_y = temp_y + 1; if (temp_y == n) { temp_y = 0; } return temp_y; } temp_y = temp_y - 1; if (temp_y < 0) { temp_y = n - 1; } return temp_y; } int get_start(int n) { return n / 2; } void assert_equal(int expected, int actual) { if (expected != actual) { printf("FAILED: expected = %d, actual = %d\n", expected, actual); } }
문제에 마방진을 만드는 규칙이 이미 잘 설명이 되어 있어서.. 그대로 코딩하면 문제를 풀 수 있다. 행과 열의 끝을 넘어 갈 때 주어진 조건 처럼 이동 시켜주는 것이 포인트 인 것 같다. 늘 경계를 처리에 대한 조건 처리는 깔끔한 방법이 안떠오른다.
— 박주연 2017/02/04 17:42
jungol/problem_2074.txt · 마지막으로 수정됨: 2017/02/04 17:12 저자 lindol