작성일 : 11-07-10 16:51
2008년도 정올 전국대회 초등부 2번/중등부 1번 기출문제
 글쓴이 : 황희선(h2sjolly)
조회 : 7,190  
제가 선생님 강좌를 듣고 코드를 짜봤는데;;
#include <stdio.h>
int w[5][7][4];
int c[7][4];
int chk=0;
int chk1=0;
int chk2=0;
int chk3=0;
int chk4=0;
int world(int a, int b) {
 if(b==6) {
  c[a][1]++;
  c[b][3]++;
  world(a+1,a+2);
  c[a][1]--;
  c[b][3]--;
  c[a][2]++;
  c[b][2]++;
  world(a+1,a+2);
  c[a][2]--;
  c[b][2]--;
  c[a][3]++;
  c[b][1]++;
  world(a+1,a+2);
  c[a][3]--;
  c[b][1]--;
 }else if(a==6) {
  for(int i=1;i<=6;i++) {
   for(int j=1;j<=3;j++) {
    if(c[i][j]!=w[1][i][j]) {
     chk=1;
    }
   }
  }
  if(chk==0) {
   chk1=1;
  }
  chk=0;
  for(int i=1;i<=6;i++) {
   for(int j=1;j<=3;j++) {
    if(c[i][j]!=w[2][i][j]) {
     chk=1;
    }
   }
  }
  if(chk==0) {
   chk2=1;
  }
  chk=0;
  for(int i=1;i<=6;i++) {
   for(int j=1;j<=3;j++) {
    if(c[i][j]!=w[3][i][j]) {
     chk=1;
    }
   }
  }
  if(chk==0) {
   chk3=1;
  }
  chk=0;
  for(int i=1;i<=6;i++) {
   for(int j=1;j<=3;j++) {
    if(c[i][j]!=w[4][i][j]) {
     chk=1;
    }
   }
  }
  if(chk==0) {
   chk4=1;
  }
  chk=0;
 }else{
  c[a][1]++;
  c[b][3]++;
  world(a,b+1);
  c[a][1]--;
  c[b][3]--;
  c[a][2]++;
  c[b][2]++;
  world(a,b+1);
  c[a][2]--;
  c[b][2]--;
  c[a][3]++;
  c[b][1]++;
  world(a,b+1);
  c[a][3]--;
  c[b][1]--;
 }
 return 0;
}
int main() {
 for(int i=1;i<=6;i++) {
  for(int j=1;j<=3;j++) {
   c[i][j]=0;
  }
 }
 FILE*fin = fopen("INPUT.TXT","r");
 for(int i=1;i<=4;i++) {
  for(int j=1;j<=6;j++) {
   for(int k=1;k<=3;k++) {
    fscanf(fin,"%d",&w[i][j][k]);
   }
  }
 }
 fclose(fin);
 world(1,2);
 printf("%d %d %d %d",chk1,chk2,chk3,chk4);
}


재귀함수에서 비교하는 게 있어서 약 28배 더 걸리더라고요;;
어떻게 하면 더 빠르게 짤 수 있을까요?
선생님 알려주세요 ㅠㅠ

황희선 11-07-10 22:33
 
최대한 고쳐보기는 했는데요;;
최대한 이렇게 해봤습니다;;
#include <stdio.h>
int w[5][7][4];
int c[7][4];
int chk=0;
int chk1=0;
int chk2=0;
int chk3=0;
int chk4=0;
int world(int a, int b) {
if(b==6) {
c[a][1]++;
c[b][3]++;
world(a+1,a+2);
c[a][1]--;
c[b][3]--;
c[a][2]++;
c[b][2]++;
world(a+1,a+2);
c[a][2]--;
c[b][2]--;
c[a][3]++;
c[b][1]++;
world(a+1,a+2);
c[a][3]--;
c[b][1]--;
}else if(a==6) {
if(chk1==0) {
for(int i=1;i<=6;i++) {
for(int j=1;j<=3;j++) {
if(c[i][j]!=w[1][i][j]) {
chk=1;
break;
}
}
if(chk==1) {
break;
}
}
}
if(chk==0) {
chk1=1;
}
chk=0;
if(chk2==0) {
for(int i=1;i<=6;i++) {
for(int j=1;j<=3;j++) {
if(c[i][j]!=w[2][i][j]) {
chk=1;
break;
}
}
if(chk==1) {
break;
}
}
}
if(chk==0) {
chk2=1;
}
chk=0;
if(chk3==0) {
for(int i=1;i<=6;i++) {
for(int j=1;j<=3;j++) {
if(c[i][j]!=w[3][i][j]) {
chk=1;
break;
}
}
if(chk==1) {
break;
}
}
}
if(chk==0) {
chk3=1;
}
chk=0;
if(chk4==0) {
for(int i=1;i<=6;i++) {
for(int j=1;j<=3;j++) {
if(c[i][j]!=w[4][i][j]) {
chk=1;
break;
}
}
if(chk==1) {
break;
}
}
}
if(chk==0) {
chk4=1;
}
chk=0;
return 0;
}else{
c[a][1]++;
c[b][3]++;
world(a,b+1);
c[a][1]--;
c[b][3]--;
c[a][2]++;
c[b][2]++;
world(a,b+1);
c[a][2]--;
c[b][2]--;
c[a][3]++;
c[b][1]++;
world(a,b+1);
c[a][3]--;
c[b][1]--;
}
return 0;
}
int main() {
for(int i=1;i<=6;i++) {
for(int j=1;j<=3;j++) {
c[i][j]=0;
}
}
FILE*fin = fopen("INPUT.TXT","r");
for(int i=1;i<=4;i++) {
for(int j=1;j<=6;j++) {
for(int k=1;k<=3;k++) {
fscanf(fin,"%d",&w[i][j][k]);
}
}
}
fclose(fin);
world(1,2);
FILE*fout=fopen("OUTPUT.TXT","w");
fprintf(fout,"%d %d %d %d",chk1,chk2,chk3,chk4);
fclose(fout);
}
약 2초정도 걸리네요;;
어떻게 하면 더 줄일 수 있을까요?
 
 

Total 635
번호 제   목 글쓴이 날짜 조회
55 올림피아드 강의 교재는 별도로 없는건지용~ (1) 한지민 08-27 8387
54 엑셀 완전초짜인데요 차트 만들기요..질문 (1) 정동명 08-25 8492
53 알고리즘 강좌 수강하고자 합니다. (1) 박수현 08-22 8830
52 알고리즘 강좌 신청합니다 (1) 이재성 07-13 7103
51 알고리즘 강의신청이요 (1) 김선미 07-13 6804
50 기하 알고리즘 강좌 질문 있습니다. (2) 황희선 07-11 7800
49 2008년도 정올 전국대회 초등부 3번문제 (1) 황희선 07-11 8092
48    2008년도 정올 전국대회 초등부 3번문제 (1) 컴스쿨 07-11 7864
47 2008년도 정올 전국대회 초등부 2번/중등부 1번 기출문제 (1) 황희선 07-10 7191
46    2008년도 정올 전국대회 초등부 2번/중등부 1번 기출문제 (4) 컴스쿨 07-11 10088
45 알고리즘 강의신청합니다~^^ (1) 황희선 07-10 6703
44 알고리즘 강의신청이요 (1) 김선미 07-08 6724
43 알고리즘 강의 신청 (1) 최현민 07-05 6692
42 교육신청과목어디서찾나요 (1) 안병태 06-29 6754
41 동영상 재생 (7) 김태경 06-28 6899
40 2006 전국 본선 1번 문제 (3) 금은실 06-27 7048
39 알고리듬 강의 신청 (1) 문일준 06-20 6858
38 알고리즘 강의 신처 (1) 이여진 06-15 7138
37 미디어 연결중 (2) 이수정 05-20 7586
36 Dyamic(동전 바꿔주기) (1) 김현수 05-19 13156
 1  2  3  4  5  6  7  8  9  10  11  12  13  14  15  16  17  18  19  20  21  22  23  24  25  26  27  28  29  30    

회사소개 | 개인정보처리방침 | 이용약관 | 찾아오시는 길 | 이메일주소 무단수집거부 | 사업자정보확인
경기도 안양시 동안구 호계동 1065-10 협성골드프라자 601호 한컴에듀케이션(주) TEL : 031-388-8840 FAX : 031-388-0996
대표자 : 김동규 사업자번호 : 130-86-02870 통신판매업신고번호 : 제 2010-경기안양-888호
COPYTIGHT(C) 한컴에듀케이션(주), ALL RIGHT RESERVED.
담은강좌 : 0