World Finals >> 1994 - Phoenix
问题链接:UVA232 UVALive5171 POJ1888 Crossword Answers。基础训练级的问题,用C语言编写程序。
典型单词谜题中,计算单词个数问题。
给网格扩充了四个方向的边界。这样可以简化程序逻辑,使得边缘格的处理逻辑与中间格的处理逻辑相同。使得判断网格是否为单词的开始网格条件统一;同时,计算行单词和列单词的逻辑也变得简单。
另外一点就是要明确单纯开始网格的条件,以及如何计算单词的序号(序号增加的条件)。
程序中,将边界设置为“*”,程序逻辑比较简洁。
AC的C语言程序如下:
/* UVA232 UVALive5171 POJ1888 Crossword Answers */ #include <stdio.h> #define MAXN 10 char grid[MAXN+2][MAXN+2]; /* 输出行单词 */ void rowoutput(int no, int row, int col) { printf("%3d.", no); while(grid[row][col] != '*') putchar(grid[row][col++]); putchar(' '); } /* 输出列单词 */ void coloutput(int no, int row, int col) { printf("%3d.", no); while(grid[row][col] != '*') putchar(grid[row++][col]); putchar(' '); } int main(void) { int r, c, caseno=0, wcount, i, j; while(scanf("%d", &r) != EOF && r != 0) { /* 已经读入行,继续读入列 */ scanf("%d", &c); getchar(); /* 读入网格 */ for(i=1; i<=r; i++) { for(j=1; j<=c; j++) grid[i][j] = getchar(); getchar(); /* ' ' */ } // 设置边界 for(i=0; i<r+2; i++) { grid[i][0] = '*'; grid[i][c+1] = '*'; } for(i=0; i<c+2; i++) { grid[0][i] = '*'; grid[r+1][i] = '*'; } /* 计算并且输出结果 */ if(++caseno > 1) printf(" "); printf("puzzle #%d: ", caseno); /* 行计算并且输出结果 */ printf("Across "); wcount = 0; for(i=1; i<=r; i++) { for(j=1; j<=c; j++) if(grid[i][j] != '*' && (grid[i-1][j] == '*' || grid[i][j-1] == '*')) { wcount++; if(grid[i][j-1] == '*') rowoutput(wcount, i, j); } } /* 列计算并且输出结果 */ printf("Down "); wcount = 0; for(i=1; i<=r; i++) { for(j=1; j<=c; j++) if(grid[i][j] != '*' && (grid[i-1][j] == '*' || grid[i][j-1] == '*')) { wcount++; if(grid[i-1][j] == '*') coloutput(wcount, i, j); } } } return 0; }