프로그래밍

 3198, 1/160 회원가입  로그인  
   capt_0669
   [C언어] 도전프로그래밍 삼: 아나 해도해도 안되서 물어봅니다

http://www.hackerschool.org/HS_Boards/zboard.php?AllArticle=true&no=3017 [복사]


달팽이 배열을 만들어야되는데요
1     2     3     4
12   13   14   5
11   16   15   6
10   9     8     7

이런식으로요

그런데....이거 해보신분들 (천제분들 말고)는 아시겠지만 참 간단한게 아니잖아요...

진짜 물어보는거 싫어하는데 물어봅니다......ㅠ.ㅠㅠ.ㅠ.ㅠ.ㅠ.ㅠ.ㅠ..ㅠ.ㅠ.ㅠ..ㅠㅠ.ㅠㅠ.ㅠ

제가 들어온지 반년?은 넘었네요
다시 C를 정복해야죠
아이팟이나 안드로이드 게임 만들려면;;;

  Hit : 5011     Date : 2011/05/26 07:51



    
prosthetics 우선 가장 간단하게 만든다면 배열에 일일이 숫자를 대입해 주면 되겠지요.
시간이 조금 걸리겠지만 프로그램 자체는 가장 빠르고 정확한 프로그램이 됩니다.
하지만 질문자께서 원하시는 답은 이런게 아니겠지요.

달팽이수열 문제는 사실 C언어 문제가 아닙니다.
알고리즘 문제이지요.
어떤 순서와 규칙으로 풀어나가야 하는지를 알아야 하기 때문에 C언어 문법을 모두 깨우친 후에
가장 어려운 문제라고 손꼽히는 문제입니다.
따라서 C언어는 일단 제껴두고 패턴을 파악하는 것이 중요합니다.

규칙을 알기 위해 일단 배열에 값을 일일이 대입해 보겠습니다.

char DPE[4][4];

DPE[0][0] = '1';
DPE[0][1] = '2';
DPE[0][2] = '3';
DPE[0][3] = '4';

DPE[1][3] = '5';
DPE[2][3] = '6';
DPE[3][3] = '7';

DPE[3][2] = '8';
DPE[3][1] = '9';
DPE[3][0] = '10';

DPE[2][0] = '11';
DPE[1][0] = '12';

DPE[2][1] = '13';
DPE[2][2] = '14';

DPE[3][2] = '15';

DPE[3][1] = '16';

혹시 패턴이 보이신다면 바로 코딩하셔도 좋습니다 ^^...

패턴은
<1> 4 3 3 2 2 1 1
<2> 증가 증가 감소 감소 증가 증가 감소
<3> Y X Y X Y X Y

DPE[X][Y]라 할때
4번 Y증가 / 3번 X증가 / 3번 Y감소 / 2번 X감소 / 2번 Y증가 / 1번 X증가 / 1번 Y감소

위의 패턴에 맞도록 적절한 반복문과 조건문을 사용하시면 됩니다.

추가로 위의 <4x4>행렬에만 적용되는 것이 아님을 다음 <5x5>행렬을 보시면 알게 되실겁니다.

1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9
2011/05/26  
capt_0669 이런것은 찾아내기는 했죠
그런데 님처럼 이렇게 명확하게는 찾아내지는 못했는데..
질문하기전에 벌써 알고 코딩은 하고있었습니다

그런데 님의
<1> 4 3 3 2 2 1 1
<2> 증 증 감 감 증 증 감
<3> Y X Y X Y X Y

이것이 진짜 코딩하기 쉬운 팁을 주네요

다음에 프로그래밍을 짤때 그렇게 쓰면서 햐야겠어요
감사합니다^^

코드 다 짠거 나중에 보여드릴께요^^
2011/05/26  
endosymbiosis #include<stdio.h>

int main(void)
{
int input, array[15][15]={0}, i=0, j=0, top=0, bottom=0, count=1, direct=1;
printf("Input your number (1-15):");
scanf("%d", &input);
bottom=input;

while(array[i][j]==0){
if(direct){
if(i<bottom-1)
array[i++][j]=count++;
else if(j<bottom)
array[i][j++]=count++;
if(j==bottom){
i--;
j--;
bottom--;
direct=0;
}
}
else{
if(i>top)
array[i--][j]=count++;
else if(j>top)
array[i][j--]=count++;
if(j==top){
j++;
i++;
top++;
direct=1;
}
}
};

for(i=0;i<input;i++){
for(j=0;j<input;j++){
printf("%4d", array[i][j]);
}
printf("\n");
}
printf("\n");
return 0;
}
2011/06/04