U E D R , A S I H C RSS

최다인/CrossPuzzle (rev. 1.1)

최다인/Cross Puzzle

  • 2013년 10월 22일 개발

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#pragma warning(disable:4996)	//scanf 등의 함수로 인해 뜨는 4996에러를 무시함

char puz_arr[17][42];	//퍼즐판 위의 모든 단어를 저장하는 배열([0]은 입력된 단어가 겹치지 않게 넣는 것의 편의성을 위함, [16]과 [41]은 단어가 뚫고나가지 않게 함을 위함)
char input_word[100][15];	//차례로 입력되는 단어를 각각 저장하는 배열

void puz_board();	//퍼즐판을 출력하는 함수
void place_word(int word_num);	//입력받은 단어를 puz_arr에 규칙에 맞게 배치하는 함수
void order_word(int word_num);

int main()
{
	int i,word_num;

	for(i=0;i<656;i++)
		puz_arr[i/41][i%41] = ' ';
	for(i=0;i>1500;i++)
		input_word[i/15][i%15] = ' ';	//각각 배열을 모두 ' '로 초기화
	for(i=0;i<42;i++)
		puz_arr[16][i] = '!';
	for(i=0;i<17;i++)
		puz_arr[i][41] = '!';	//단어가 뚫고나가는 것을 막기 위해 만든 배열의 끝부분은 !로 초기화

	printf("☆Cross Puzzle Game☆\n");
	for(word_num=0;;word_num++)
	{
		puz_board();	//퍼즐판 출력

		printf("단어를 입력하세요(최소 2글자, 최대 15글자, end 입력시 종료됨) : ");
		scanf("%s",input_word+word_num);

		if(strlen(input_word[word_num])<2 || strlen(input_word[word_num])>15)
		{
			printf("최소 2글자, 최대 15글자의 단어를 입력해주세요.\n");
			for(i=0;i<strlen(input_word[word_num]);i++)
				input_word[word_num][i] = ' ';
			word_num--;
			continue;
		}		//입력 범위를 넘어갔을 경우 입력받은 배열을 초기화하고 다시 반복한다.

		for(i=0;i<strlen(input_word[word_num]);i++)
		{
			if(input_word[word_num][i]<'a' || input_word[word_num][i]>'z')
				break;
		}
		if(i!=strlen(input_word[word_num]))
		{
			printf("소문자 알파벳의 단어를 입력해주세요.\n");
			for(i=0;i<strlen(input_word[word_num]);i++)
				input_word[word_num][i] = ' ';
			word_num--;
			continue;
		}		//입력받은 단어가 소문자 알파벳이 아닐 경우 입력받은 배열을 초기화하고 다시 반복한다.

		if(strcmp(input_word[word_num],"end")==0)
			break;	//end가 입력되면 반복문을 빠져나감.
		place_word(word_num);
	}

	order_word(word_num);
	
	printf("\n☆입력된 단어들☆\n");
	for(i=0;i<word_num;i++)
		printf("%s\n",input_word[i]);

	system("pause");

	return 0;
}

void puz_board()
{
	int i,j;

	printf("\n");
	for(j=1;j<16;j++)
	{
		for(i=1;i<41;i++)
			printf("+-");
		printf("+\n");
		
		for(i=1;i<41;i++)
			printf("|%c",puz_arr[j][i]);
		printf("|\n");
	}
	for(i=1;i<41;i++)
		printf("+-");
	printf("+\n\n");
}

void place_word(int word_num)
{
	int i,j,k,n;
	int word_len;	//입력한 단어의 길이를 저장하기 위한 변수

	word_len = strlen(input_word[word_num]);

	if(word_num==0)
	{
		for(i=1;i<word_len+1;i++)
			puz_arr[1][i] = input_word[word_num][i-1];	//첫번째 단어는 제일 왼쪽 위부터 시작
	}
	else
	{
		for(i=1;i<16;i++)
		{
			for(j=1;j<41;j++)
			{
				if(input_word[word_num][0] == puz_arr[i][j])	//입력된 단어의 첫 글자와 같은 글자를 찾는다.
				{
					if(puz_arr[i][j+1]==' ')	//찾은 지점의 오른쪽이 빈 공간이라면,
					{
						if(puz_arr[i][j-1]==' ' && puz_arr[i-1][j+1]==' ' && (puz_arr[i+1][j+1]==' ' || puz_arr[i+1][j+1]=='!') && (puz_arr[i][j+word_len]==' ' || puz_arr[i][j+word_len]=='!'))	//단어가 오른쪽으로 들어갈 수 있는지 확인한다.
						{
							for(k=0;k<word_len;k++)
							{
								if(puz_arr[i][j+k]!=' ')	//단어의 범위 안에 이미 글자가 있다면,
								{
									if(puz_arr[i][j+k]==input_word[word_num][k])	//그 글자가 단어의 글자와 어울릴 수 있는지 확인한다.
										continue;
									else
										break;
								}
							}
							if(k==word_len)		//search가 무사히 끝났다면
							{
								for(n=0;n<word_len;n++)
									puz_arr[i][j+n] = input_word[word_num][n];	//단어를 오른쪽으로 입력
								return;
							}
						}
					}

					if(puz_arr[i+1][j]==' ')	//찾은 지점의 아래쪽이 빈 공간이라면,
					{
						if(puz_arr[i-1][j]==' ' && puz_arr[i+1][j-1]==' ' && (puz_arr[i+1][j+1]==' ' || puz_arr[i+1][j+1]=='!') && (puz_arr[i+word_len][j]==' ' || puz_arr[i+word_len][j]=='!'))	//단어가 아래쪽으로 들어갈 수 있는지 확인
						{
							for(k=0;k<word_len;k++)
							{
								if(puz_arr[i+k][j]!=' ')	//단어의 범위 안에 이미 글자가 있다면,
								{
									if(puz_arr[i+k][j]==input_word[word_num][k])	//그 글자가 단어의 글자와 어울릴 수 있는지 확인한다.
										continue;
									else
										break;
								}
							}
							if(k==word_len)		//search가 무사히 끝났다면
							{
								for(n=0;n<word_len;n++)
									puz_arr[i+n][j] = input_word[word_num][n];	//단어를 아래쪽으로 입력
								return;
							}
						}
					}
					
					else
						continue;
				}
			}
		}

		if(i==16 && j==41)	//넣을 자리를 찾지 못한 경우,
		{
			for(i=1;i<16;i++)
			{
				for(j=1;j<41;j++)
				{
					if(puz_arr[i][j]==' ')	//빈 공간을 찾아
					{
						for(k=0;k<word_len+3;k++)
						{
							if(puz_arr[i][j+k]==' ' && puz_arr[i-1][j+k]==' ' && puz_arr[i+1][j+k]==' ')	//빈 공간의 오른쪽으로 단어가 들어갈 충분한 넓이가 되는지 확인
								continue;
							else
								break;
						}

						if(k==word_len+3)	//만약 충분한 공간이 남아있다면,
						{
							for(n=0;n<word_len;n++)
									puz_arr[i][j+n+3] = input_word[word_num][n];	//단어를 오른쪽으로 입력
							return;
						}
						else
							continue;	//그렇지 않다면 계속 찾는다.
					}

				}

			}

			if(i==16 && j==41)	//그래도 넣을 자리를 찾지 못한 경우,
			{
				printf("단어를 넣을 자리가 없습니다. 다른 단어를 입력해주세요.\n");
				return;
			}
		}
	}
}

void order_word(int word_num)
{
	int i,j;
	char temp[15];

	for(i=0;i<word_num;i++)
	{
		for(j=0;j<word_num-i-1;j++)
		{
			if(strcmp(input_word[j],input_word[j+1])>0)
			{
				strcpy(temp,input_word[j]);
				strcpy(input_word[j],input_word[j+1]);
				strcpy(input_word[j+1],temp);
			}
		}
	}	//버블정렬 알고리즘
}

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
Processing time 0.0196 sec