작성일 : 11-07-10 16:51
2008년도 정올 전국대회 초등부 2번/중등부 1번 기출문제
 글쓴이 : 황희선(h2sjolly)
조회 : 8,830  
제가 선생님 강좌를 듣고 코드를 짜봤는데;;
#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 665
번호 제   목 글쓴이 날짜 조회
65 초등 정보올림피아드 기출문제풀이 full패키지 (1) 오미옥 03-07 9484
64 한글2010 무료강좌.... (1) 조영희 02-27 7554
63 강의신청했는데요 (1) 김연희 02-17 7230
62 강의신청했습니다. (1) 이준석 02-02 7360
61 이거 쫌 잘못된것 같은데요 (1) 이대열 01-20 7340
60 질문요 (2) 최은숙 10-22 8681
59 강의 보기가 안되네요. (2) 이수민 10-20 8447
58 결제 확인 바랍니다. (1) 김시원 09-25 8656
57 c++ Find Source please enter the path for이라는 메세지가 자… (1) 한지민 09-01 13698
56 채우기색 회색요..+차트이중축(29일오후1시시험급함 ㅜㅜ) 정동명 08-29 11165
55 올림피아드 강의 교재는 별도로 없는건지용~ (1) 한지민 08-27 9919
54 엑셀 완전초짜인데요 차트 만들기요..질문 (1) 정동명 08-25 10159
53 알고리즘 강좌 수강하고자 합니다. (1) 박수현 08-22 10366
52 알고리즘 강좌 신청합니다 (1) 이재성 07-13 8702
51 알고리즘 강의신청이요 (1) 김선미 07-13 8265
50 기하 알고리즘 강좌 질문 있습니다. (2) 황희선 07-11 9383
49 2008년도 정올 전국대회 초등부 3번문제 (1) 황희선 07-11 11026
48    2008년도 정올 전국대회 초등부 3번문제 (1) 컴스쿨 07-11 9346
47 2008년도 정올 전국대회 초등부 2번/중등부 1번 기출문제 (1) 황희선 07-10 8831
46    2008년도 정올 전국대회 초등부 2번/중등부 1번 기출문제 (4) 컴스쿨 07-11 11800
   31  32  33  34  

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