1525 크레이지 아케이드

 

http://codeup.kr/problem.php?id=1525

 

크레이지 아케이드

-2 0 0 -1 0 -1 -1 -2 -2 -1 -2 -2 -1 0 -1 -1 -2 -2 -2 0 -2 -1 -2 -1 -2 -2 -2 0 0 0 -2 -1 -1 -2 -2 0 0 0 0 0 -1 0 0 -2 0 0 0 0 0 0 0 0 0 -2 0 0 0 0 0 0 0 0 0 -2 0 0 0 0 0 0 -2 -2 -2 -2 -2 -2 -2 -2 -2 0 0 0 0 -2 0 -2 -2 -2 0 0 0 0 0 -2 0 0 -2 0 0 2 Character

codeup.kr

 

반복 사용되는 for문을 줄였다.

반복 사용되는 if문을 줄였다.

전역 변수로 분리하여 초기값 설정구문을 줄였다.

 

#define A a[x][y]
#define N a[i][j]
#define P for(i=1;i<=n;i++)
#define X(m) for(m=1;m<11;m++)
#define W if(t==
int n,i,j,f,k,a[11][11],U,R,c[9],l,x,y;int C(int t){W 1){U=0;R=-1;}W 2){U=0;R=1;}W 3){U=-1;R=0;}W 4){U=1;R=0;}}main(){X(i)X(j)scanf("%d",&N);X(i){X(j){if(N>0){for(k=1;k<5;k++){C(k);x=i;y=j;l=A;f=l;while(x&&y&&f!=-1&&x<11&&y<11&&l){x+=U;y+=R;f=A;if(!f)A=-2;l--;}}N=-2;}}}scanf("%d",&n);P{scanf("%d%d",&x,&y);if(!A){A=i;c[i]=i;}}X(i){X(j) printf("%d ",N);puts("");}puts("Character Information");P{printf("player %d ",i);if(c[i])puts("survive");else puts("dead");}}

 

//어찌저찌 2등했는데 1등 코드가 상상이 안간다.

//뭔가 내 방식과는 달리 최적화된 다른 알고리즘을 사용하는 것 같기도 하다.

'C, C++ > 숏코딩 일지' 카테고리의 다른 글

4577번 소코반 문제를 줄여보았다.  (0) 2019.04.27

4577 소코반

 

https://www.acmicpc.net/problem/4577

 

4577번: 소코반

문제 소코반은 1982년에 일본에서 만들어진 게임으로, 일본어로 창고지기라는 뜻이다. 이 게임은 캐릭터를 이용해 창고 안에 있는 박스를 모두 목표점으로 옮기는 게임이다. 목표점의 수와 박스의 수는 같다. 플레이어는 화살표(위, 아래, 왼쪽, 오른쪽)를 이용해 캐릭터를 아래와 같은 규칙으로 조정할 수 있다. 캐릭터에게 지시한 방향이 빈 칸(박스나 벽이 아닌 곳)인 경우에는 그 칸으로 이동한다. 지시한 방향에 박스가 있는 경우에는, 박스를 민다. 이 경우에는

www.acmicpc.net

 

저번에 푼 소코반 문제이다.

가뜩이나 푼 사람이 없어서 그냥 문제 해결만 해도 숏코딩 랭킹에 올라갈 수 있는 문제이다.

그래서 나는 내 코드를 줄이고 좌표값의 대각선 칸들을 비교하는 구문들을 define으로 정의하여 줄였다.

그리고 전역변수로 전부 뽑아서 초기값 구문을 줄이고, 반복 사용되는 for문들을 정의하여 줄였다.

 

#include <string.h>
#define c S[x+U+U][y+L+L]
#define s S[x+U][y+L]
int R,C,U,L,Z,l,q,H;char S[16][16],M[51];int T(char B){if(B==85){U=-1;L=0;}else if(B==68){U=1;L=0;}else if(B==76){U=0;L=-1;}else if(B==82){U=0;L=1;}}void K(){int i,j;q=1;for(i=0;i<R;i++){for(j=0;j<C;j++){if(S[i][j]==98){q=0;return;}}}}void P(int n,int m){if(S[n][m]==87)S[n][m]=43;if(S[n][m]=='w')S[n][m]=46;}void O(){int i,j;for(i=0;i<R;i++){for(j=0;j<C;j++){printf("%c",S[i][j]);}puts("");}}int p(int x,int y){if(l==Z){K();if(q)printf("Game %d: complete\n",H);else printf("Game %d: incomplete\n",H);O();return 0;}T(M[l]);K();if(!q){if(s==46){P(x,y);x+=U;y+=L;S[x][y]='w';l++;p(x,y);}else if((s==98|s==66)&c!=98&c!=66&c!=35){P(x,y);x+=U;y+=L;if(s==43)s=66;else s=98;if(S[x][y]==66)S[x][y]=87;else S[x][y]='w';l++;p(x,y);}else if(s==43){P(x,y);x+=U;y+=L;S[x][y]=87;l++;p(x,y);}else{l++;p(x,y);}}else{printf("Game %d: complete\n",H);O();}}main(){int i,j,X,Y;while(1){scanf("%d %d",&R,&C);if(!R&!C)break;for(i=0;i<R;i++)scanf("%s",S[i]);for(i=0;i<R;i++){for(j=0;j<C;j++){if(S[i][j]=='w'||S[i][j]==87){X=i;Y=j;}}}scanf("%s",M);Z=strlen(M);q=0;l=0;H++;p(X,Y);}}

 

코드 길이 1125B, 어찌저찌 1등이다.

+ Recent posts