⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cuberolf.c

📁 1995年ACM contest FINAL试题和源码
💻 C
字号:
/*1995-96 ACM International Collegiate Programming ContestSouthwestern European Regional ContestETH Zurich, SwitzerlandDecember 9, 1995Problem: CubeIdea:			Erwin Achermann, ETH ZurichImplementation:	Rolf Strebel, ETH ZurichSource file: cube.c / cube.pInput file: cube.inOutput file: cube.out*/#include <stdio.h>#include <stdlib.h>#define NOFP 7#define MAXV 1000typedef struct CubeDesc {  int d[3];  int a[27];} CubeDesc, *Cube;#define c_i(c,i,j,k) ((*(c)).a[(i)+3*(j)+9*(k)])#define c_d(c,i)     ((*(c)).d[i])CubeDesc part[NOFP] = {  {{3,2,1},{1,1,1,1}},  {{2,2,1},{1,1,0,1}},  {{3,2,1},{1,1,1,0,1}},  {{3,2,1},{1,1,0,0,1,1}},  {{2,2,2},{1,1,0,1,0,0,0,0,0,1}},  {{2,2,2},{1,1,0,0,1,0,0,0,0,1}},  {{2,2,2},{1,0,0,1,1,0,0,0,0,1}},};FILE *fout;/*--------------------------------*//* function prototypes */void l_init(void);int l_insert(int, int);void error (char *str);void c_print (Cube c);CubeDesc shift (Cube c, int x, int y, int z);CubeDesc rotate (Cube c, int x, int y, int z);int code (Cube c);void t_print (int p);void init (void) ;void gen (void);void traverse (int p, int c);/*--------------------------------*//* list section */static struct {  int v[MAXV];  int nof;} list[NOFP];#define l_nof(p) (list[p].nof)#define l_c(p,j) (list[p].v[j])void l_init (void){  int i;  for (i = 0; i < NOFP; i++) {    l_nof(i) = 0;  }}int l_insert (int i, int c){  int j;  for (j = 0; j < l_nof(i); j++) {    if (c == l_c(i,j)) return (0);  }  j = l_nof(i);  l_c(i,j) = c;  l_nof(i) = j + 1;  return (1);}/*--------------------------------*//* error handling */void error (char *str){  fprintf (stderr, "--> ERROR: %s\n", str);  exit (1);}/*--------------------------------*//* cube motion, print */void c_print (Cube c){  int j,k,l;  for (j = 0; j < 3; j++) {    for (k = 0; k < 3; k++) {      for (l = 0; l < 3; l++) {       fprintf (fout,"%c", (char)(c_i(c,j,k,l)?('O'):('.')));      }    }  }}CubeDesc shift (Cube c, int x, int y, int z){  CubeDesc d = {{0},{0}};  int j,k,l;  for (j = x; j < 3; j++) {    for (k = y; k < 3; k++) {      for (l = z; l < 3; l++) {       c_i(&d,j,k,l) = c_i(c,j-x,k-y,l-z);      }    }  }  return (d);}CubeDesc rotate (Cube c, int x, int y, int z){  CubeDesc d, e;  int i,j,k,l;  d = (*c);  for (i = 0; i < x; i++) {    for (j = 0; j < 3; j++) {      for (k = 0; k < 3; k++) {       for (l = 0; l < 3; l++) {         c_i(&e,j,k,l) = c_i(&d,j,l,2-k);       }      }    }    d = e;  }  for (i = 0; i < y; i++) {    for (j = 0; j < 3; j++) {      for (k = 0; k < 3; k++) {       for (l = 0; l < 3; l++) {         c_i(&e,j,k,l) = c_i(&d,2-l,k,j);       }      }    }    d = e;  }  for (i = 0; i < z; i++) {    for (j = 0; j < 3; j++) {      for (k = 0; k < 3; k++) {       for (l = 0; l < 3; l++) {         c_i(&e,j,k,l) = c_i(&d,k,2-j,l);       }      }    }    d = e;  }  return (d);}/*--------------------------------*//* code (Cube --> int) */int code (Cube c){  int i;  int j,k,l;    i = 0;  for (j = 0; j < 3; j++) {    for (k = 0; k < 3; k++) {      for (l = 0; l < 3; l++) {       i = (i << 1) | c_i(c,j,k,l);      }    }  }  return (i);}/*--------------------------------*//* generation and traversal */static int t_count;static int t_tab[NOFP];static char t_char[] = "abcdefg";void t_print (int p){  int i, j;  char ch;  for (i = 0; i < 27; i++) {    ch = '.';    for (j = 0; j < p; j++) {      if (l_c(j,t_tab[j]) & (1 << i)) {       ch = t_char[j];        break;      }    }    fprintf (fout,"%c", (char)ch);  }  fprintf (fout,"\n");}       void init (void) {  l_init ();  t_count = 0;}void gen (void){  int p;  int j,k,l;  int z;  CubeDesc c, d, e;  for (p = 0; p < NOFP; p++) {    c = part[p];    for (j = 0; j <= 3 - c_d(&c,0); j++) {      for (k = 0; k <= 3 - c_d(&c,1); k++) {       for (l = 0; l <= 3 - c_d(&c,2); l++) {         d = shift (&c, j, k, l);         if (p == 0) {           l_insert (p, code(&d));         } else {           for (z = 0; z < 4; z++) {             e = rotate (&d, 0, 0, z); l_insert (p, code(&e));             e = rotate (&d, 1, 0, z); l_insert (p, code(&e));             e = rotate (&d, 2, 0, z); l_insert (p, code(&e));             e = rotate (&d, 3, 0, z); l_insert (p, code(&e));             e = rotate (&d, 0, 1, z); l_insert (p, code(&e));             e = rotate (&d, 0, 3, z); l_insert (p, code(&e));           }         }       }      }    }  }}void traverse (int p, int c){  int i;  int d;  if (p == NOFP) {    t_count++;    t_print(p);  } else {    for (i = 0; i < l_nof(p); i++) {      d = l_c(p,i);      if (!(d & c)) {       t_tab[p] = i;       traverse (p+1, d | c);      }    }  }}/*--------------------------------*//* main program */#if DEBUGvoid codeprint (int c){  int i;  for (i = 0; i < 27; i++) {    printf ("%c",(char)(c&1)?('O'):('.'));    c >>= 1;  }  printf ("\n");}#endifint main (int argc, char **argv){  if (argc > 1) error ("USAGE: cube");  if (sizeof(int) < 4) error ("sizeof(int) too small");    fout = fopen("cube.out", "w");  init ();  gen ();#if DEBUG  {    int p, i;      for (p = 0; p < NOFP; p++) {      printf ("%i: nof= %i\n", (int)p, (int)l_nof(p));    }    p = 1;    for (i = 0; i < l_nof(p); i++) {      codeprint (l_c(p,i));    }  }  exit (0);#endif  traverse (0, 0);#if DEBUG  printf ("%i\n", (int)t_count);#endif	fclose(fout);	return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -