2013. 5. 15. 11:10ㆍ프로그래밍/C/C++
#include <stdio.h>
int main()
{
int magic[19][19]; //최대 19*19의 마방진을 생성하는 2차원 배열
int size, x, y, i, saveX, saveY;
do{
scanf("%d", &size); //마방진의 크기를 입력받는다.
}while(size<3 || size>19 || size %2==0); //3에서 19사이의 홀수를 입력받을 때 까지 반복
//2차원 배열의 모든 요소를 0으로 초기화 시킨다.
for(y=0 ; y<size ; y++)
{
for(x=0 ; x<size ; x++)
{
magic[y][x] = 0;
}
}
//최상단 가운데 지점에 1을 넣기 위해 x, y 좌표를 설정
x = size/2;
y=0;
//위에서 설정한 초기 좌표에 1을 대입
magic[y][x] = 1;
//반복문을 돌며 2부터 size*size까지의 수를 규칙에 따라 대입
for(i=2 ; i<=size*size ; i++)
{
//현재의 좌표를 save변수에 저장
saveX = x;
saveY = y;
//x, y 좌표를 좌측 상단으로 이동(↖)
x--;
y--;
//x좌표가 -인경우 x좌표를 가장 우측으로 설정
if(x<0)
x=size-1;
//y좌표가 -인경우 y좌표를 맨 아래로 설정
if(y<0)
y=size-1;
//좌측 상단(↖)의 좌표에 값이 이미 있는 경우
if(magic[y][x] > 0)
{
//좌표를 좌측 상단(↖)의 하단(↓)으로 이동
//좌측 상단(↖)으로 이동하기 전 좌표값에서 아래방향(↓)으로 한칸 이동시킨다.
x = saveX;
y = saveY+1;
}
magic[y][x] = i; //설정된 좌표값에 숫자를 대입
}
//2차원 배열을 화면에 출력
for(y=0 ; y<size ; y++)
{
for(x=0 ; x<size ; x++)
{
printf("%2d ", magic[y][x]);
}
printf("\n"); //하나의 행이 끝나면 한줄을 내린다.
}
return 0;
}
각 행과 열의 합을 출력하는 코드 추가
#include <stdio.h>
int main()
{
int magic[19][19]; //최대 19*19의 마방진을 생성하는 2차원 배열
int size, x, y, i, saveX, saveY, col[19], row;
do{
scanf("%d", &size); //마방진의 크기를 입력받는다.
}while(size<3 || size>19 || size %2==0); //3에서 19사이의 홀수를 입력받을 때 까지 반복
//2차원 배열의 모든 요소를 0으로 초기화 시킨다.
for(y=0 ; y<size ; y++)
{
for(x=0 ; x<size ; x++)
{
magic[y][x] = 0;
}
col[y] = 0;
}
//최상단 가운데 지점에 1을 넣기 위해 x, y 좌표를 설정
x = size/2;
y=0;
//위에서 설정한 초기 좌표에 1을 대입
magic[y][x] = 1;
//반복문을 돌며 2부터 size*size까지의 수를 규칙에 따라 대입
for(i=2 ; i<=size*size ; i++)
{
//현재의 좌표를 save변수에 저장
saveX = x;
saveY = y;
//x, y 좌표를 좌측 상단으로 이동(↖)
x--;
y--;
//x좌표가 -인경우 x좌표를 가장 우측으로 설정
if(x<0)
x=size-1;
//y좌표가 -인경우 y좌표를 맨 아래로 설정
if(y<0)
y=size-1;
//좌측 상단(↖)의 좌표에 값이 이미 있는 경우
if(magic[y][x] > 0)
{
//좌표를 좌측 상단(↖)의 하단(↓)으로 이동
//좌측 상단(↖)으로 이동하기 전 좌표값에서 아래방향(↓)으로 한칸 이동시킨다.
x = saveX;
y = saveY+1;
}
magic[y][x] = i; //설정된 좌표값에 숫자를 대입
}
//2차원 배열을 화면에 출력
for(y=0 ; y<size ; y++)
{
row = 0;
for(x=0 ; x<size ; x++)
{
row += magic[y][x]; //가로 행의 값을 더한다.
col[x] += magic[y][x]; //세로 열의 값을 더해서 열 배열에 저장
printf("%4d ", magic[y][x]);
}
printf("%d", row); //가로행의 값을 한줄을 내리기 전에 출력
printf("\n"); //하나의 행이 끝나면 한줄을 내린다.
}
for(x=0 ; x<size ; x++)
{
printf("%4d ", col[x]); //마방진의 출력이 끝난뒤 열의 값을 한줄로 출력
}
printf("Sum\n"); //하나의 행이 끝나면 한줄을 내린다.
return 0;
}
'프로그래밍 > C/C++' 카테고리의 다른 글
[논리적 사유연습]구조체 (0) | 2013.06.03 |
---|---|
[논리적 사유연습]선택정렬, 버블정렬, 삽입정렬 (0) | 2013.05.27 |
[논리적 사유연습]윷을 던졌을 때의 확률 구하기 (0) | 2013.05.13 |
[논리적 사유연습]PuzzleStrike(숫자야구게임) (0) | 2013.05.08 |
[논리적 사유연습]BirthdayParadox 문제해결 (0) | 2013.05.06 |