출처 : 반크_세계유산 석굴암
문제]
P86 참조
입력)
첫째 줄은 테스트케이스 N을 입력한다( 0 < N <=3)
둘째 줄은 지도의 크기를 입력한다.(4<=T<=50)
셋째 줄은 쉼표를 기준으로 A,B,C형 폭탄의 떨어진 좌표를 입력한다.
출력)
#테스트케이스 1~N번을 출력하고 한칸 띄어 그에 해당하는 영향을 받지 않는 칸의 개수를 출력한다.
입력 예)
3
7
0 0 1 5 3 5 5 6,1 1 2 4 5 2,3 2 5 5
4
0 1 1 3,2 2,2 3 3 3
5
0 0 3 4 2 4,1 2 4 2,3 2 4 4
출력 예)
#1 10
#2 1
#3 4
참고풀이]
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int get(int i, int j, int num)//범위(range) 체크 함수
{
if(i<0 || j<0 || i>=num || j>=num)
return 0;
return 1;
}
int matrix(char **board, int num) //A, B, C형 폭탄의 범위 계산
{
int i,j;//반복변수, 인덱스 변수
int remainder;//남은 지역 수 변수
for(i=0; i<num; i++)
for(j=0; j<num; j++)
switch(board[i][j])
{
case 'C': //C형 폭탄 3칸의 범위 체크
if(get(i-3,j,num)==1 && board[i-3][j]=='0') board[i-3][j]='1';
if(get(i,j-3,num)==1 && board[i][j-3]=='0') board[i][j-3]='1';
if(get(i+3,j,num)==1 && board[i+3][j]=='0') board[i+3][j]='1';
if(get(i,j+3,num)==1 && board[i][j+3]=='0') board[i][j+3]='1';
case 'B': //B형 폭탄 2칸의 범위 체크
if(get(i-2,j,num)==1 && board[i-2][j]=='0') board[i-2][j]='1';
if(get(i,j-2,num)==1 && board[i][j-2]=='0') board[i][j-2]='1';
if(get(i+2,j,num)==1 && board[i+2][j]=='0') board[i+2][j]='1';
if(get(i,j+2,num)==1 && board[i][j+2]=='0') board[i][j+2]='1';
case 'A': //A형 폭탄 1칸의 범위 체크
if(get(i-1,j,num)==1 && board[i-1][j]=='0') board[i-1][j]='1';
if(get(i,j-1,num)==1 && board[i][j-1]=='0') board[i][j-1]='1';
if(get(i+1,j,num)==1 && board[i+1][j]=='0') board[i+1][j]='1';
if(get(i,j+1,num)==1 && board[i][j+1]=='0') board[i][j+1]='1';
}
//폭탄위치에서 영향을 받지 않는 위치 카운트
remainder=0;
for(i=0;i<num;i++)
for(j=0;j<num;j++)
if(board[i][j]=='0') remainder++;
return remainder; //폭탄의 영향 받지 않은 지역 수 반환
}
int main()
{
FILE *fin, *fout;
fin=fopen("input.txt","r");
fout=fopen("ontput.txt","w");
char tempNum[50], temp[100];//파일 입출력
char **arrNum; //2차원 배열
char *cutStr[3]; //폭탄 위치 좌표 변수
int num, size[3]; //지도크기와 A,B,C형 폭탄의 좌표 문자열의 길이수
int pt[3][8]={0,}, ptx, pty; //좌표변수
int i,j,k;//반복변수
int remainder, testNum;//남은 지역수, 테스트케이스 변수
while(1) //테스트케이스의 범위를 체크한다
{
fgets(temp, 100, fin);
testNum=atoi(temp);
if(testNum>0 && testNum<=3) break;
exit(-1);//작업종료하기
}
for(k=0; k<testNum; k++)
{
while(1) //지도크기의 수의 범위를 체크한다.
{
fgets(tempNum, 50,fin);
num=atoi(tempNum);
if(num>=4 && nem<=50) break;
exit(-1);
}
while(1) //입력된 좌표가 ,(2개)로 구분되었는지 체크한다.
{
fgets(temp,100,fin);
j=0;
for(i=0;i<strlen(temp);i++)
if(temp[i]==',') j++;
if(j==2) break;
exit(-1);
}
//지도 크기 할당
arrNum=(char **)malloc(sizeof(char *)*num);//배열크기 할당
for(i=0;i<num;i++)
arrNum[i]=(char *)malloc(sizeof(char)*num);
//선언된 배열에 초기값 설정
for(i=0;i<num;i++)
for(j=0;j<num;j++)
arrNum[i][j]='0';
//각형의 좌표를 각형의 문자열에 저장
cutStr[0]=strtok(temp,",");//A형
cutStr[1]=strtok(NULL,",");//B형
cutStr[2]=strtok(NULL,",");//C형
//각형 좌표 문자열의 길이를 저장
for(i=0;i<3;i++)
size[i]=strlen(cutStr[i]);
//좌표를 숫자로 변환하여 저장하기
for(i=0;i<3;i++)
{
pt[i][0]=atoi(strtok(cutStr[i]," "));
for(j=1;j<=(size[i]-1)/2;j++)
pt[i][j]=atoi(strtok(NULL," "));
}
//지정된 좌표에 폭탄을 위치한다.
for(i=0;i<3;i++)
{
for(j=0;j<=(size[i]-1)/2;j++)
{
if(i==0)
{
if((i+j)%2==0)
ptx=pt[i][j];
else
{
pty=pt[i][j];
arrNum[ptx][pty]='A';
}
}
else if(i==1)
{
if((i+j)%2==0)
{
pty=pt[i][j];
arrNum[ptx][pty]='B';
}
else
ptx=pt[i][j];
}
else
{
if((i+j)%2==0)
ptx=pt[i][j];
else
{
pty=pt[i][j];
arrNum[ptx][pty]='C';
}
}
}
}
remainder=matrix(arrNum,num);//함수 호출 후 남은 지역 수 반환받는다.
//결과 파일로 출력
fprintf(fout, "#%d %d\n",k+1,remainder);
}
fclose(fout);
fclose(fin);
return 0;
}
참고풀이 결과]
입력파일] input.txt
대한민국의 아름다운 영토, 독도의 여름
'프로그램 > C언어 1000제' 카테고리의 다른 글
C언어 136제] 두근두근 파이썬(개정판) CHAPTER 7 연습문제5 p233 (0) | 2024.02.11 |
---|---|
C언어 135제] 문제와 같은 모래시계를 작성하시오. (0) | 2022.06.09 |
C언어 133제] 게임 프로젝트 1. 두뇌 개발 프로젝트 Ver 0.3 (0) | 2022.03.22 |
C언어 132제] 게임 프로젝트 1. 두뇌 개발 프로젝트 Ver 0.2 (0) | 2022.03.16 |
C언어 131제] 게임 프로젝트 1. 두뇌 개발 프로젝트 Ver 0.1 (0) | 2022.03.15 |
댓글