算法竞赛入门经典(第2版)习题3-6 纵横字谜的答案 Crossword Answers UVa232
2014-07-11 12:23
357 查看
写这题用了一上午,样例数据都过了后提交发现WA。
逻辑很简单,没什么可查的,试探着把数组大小界限从10改成15发现AC了。
逻辑很简单,没什么可查的,试探着把数组大小界限从10改成15发现AC了。
//#define LOCAL //#define TESTING #include<stdio.h> #include<string.h> #include<ctype.h> char m[15][15],across[100][15],down[100][15]; int begin_x[100],begin_y[100],begin_a[100],begin_d[100]; int main() { #ifdef LOCAL freopen("xt3-6.in","r",stdin); #endif int r,c,ansa,ansd,T = 1; bool line = false; while(T) { memset(m,0,sizeof(m)); memset(begin_x,0,sizeof(begin_x)); memset(begin_y,0,sizeof(begin_y)); memset(begin_a,0,sizeof(begin_a)); memset(begin_d,0,sizeof(begin_d)); memset(across,0,sizeof(across)); memset(down,0,sizeof(down)); ansa=0; ansd=0; //读取网格行列数 scanf("%d", &r); if(r==0) return 0; scanf("%d", &c); getchar(); //读取网格行列数结束 // 读取网格 char temp; temp = getchar(); //printf("temp= %c\n", temp); if(isalpha(temp)||temp == '*') { for(int i = 0; i < r; i++) { for(int j = 0; j < c; j++) { if(i+j == 0) m[0][0] = temp; else m[i][j] = getchar(); if(!isalpha(m[i][j])&&m[i][j]!='*') j--; //printf("%c", m[i][j]); } } } else temp = getchar(); //读取网格结束 //确定起始格 int begin = 0; for(int i = 0; i < r; i++) { for(int j = 0; j < c; j++) { if(m[i][j]!='*') { if((i-1<0)||(j-1<0)) { begin_x[begin] = i; begin_y[begin] = j; begin++; } else if(m[i-1][j]=='*' || m[i][j-1]=='*') { begin_x[begin] = i; begin_y[begin] = j; begin++; } } } } //确定起始格结束 //找出横向单词 for(int i = 0; i < begin; i++) { int x, y; x = begin_x[i]; y = begin_y[i]; if(y-1<0||m[x][y-1]=='*') { begin_a[ansa]=i+1; for(int j = 0; j+y<c; j++) { if(m[x][y+j]!='*') { across[ansa][j] = m[x][y+j]; //printf("ansa=%d j=%d y=%d across=%s\n", ansa, j, y, across[ansa]); } else break; } ansa++; } } //找出横向单词结束 //找出竖向单词 for(int i = 0; i < begin; i++) { int x, y; x = begin_x[i]; y = begin_y[i]; if(x-1<0||m[x-1][y]=='*') { begin_d[ansd]=i+1; for(int j = 0; j+x<r; j++) { if(m[x+j][y]!='*') { down[ansd][j] = m[x+j][y]; //printf("ansa=%d j=%d y=%d across=%s\n", ansa, j, y, across[ansa]); } else break; } ansd++; } } //找出竖向单词结束 //输出结果 if(line) printf("\n"); line = true; printf("puzzle #%d:\n",T); #ifdef TESTING printf("r=%d c=%d begin=%d\n", r, c,begin); for(int i = 0; i < r; i++) { for(int j = 0; j < c; j++) { printf("%c", m[i][j]); if(j == c-1) printf("\n"); } } #endif printf("Across\n"); for(int i = 0; i < ansa; i++) printf("%3d.%s\n",begin_a[i], across[i]); printf("Down\n"); for(int i = 0; i < ansd; i++) printf("%3d.%s\n",begin_d[i], down[i]); //输出结果结束 T++; } return 0; }
相关文章推荐
- 习题3-6 纵横字谜的答案(Crossword Answers, ACM/ICPC World Finals 1994, UVa232)
- 算法竞赛入门经典(第2版)习题6-3 二叉树重建 UVa536
- C++程序设计(第2版)课后习题答案--第12章
- 算法竞赛入门经典(第2版)习题1-1详解
- 算法竞赛入门经典 第2章 习题答案
- JAVA代码—算法竞赛入门经典(第2版)刘汝佳题解—习题2-4 子序列的和
- C程序设计语言(第2版)习题答案
- 算法竞赛入门经典(第2版)习题4-2 正方形UVa201
- 习题3-6 纵横字谜的答案(Crossword Answers) UVa 232
- 《算法竞赛入门经典》习题答案 -- Chapter II
- 算法竞赛入门经典(第2版)习题3-9 子序列 All in All UVa10340
- JAVA代码—算法竞赛入门经典(第2版)刘汝佳题解—习题3-1 得分
- 算法竞赛入门经典(第2版)第一章习题(Java)
- 算法竞赛入门经典(第2版)习题4-4 骰子涂色UVa253
- 算法竞赛入门经典(第2版)习题3-1 得分 Score UVa1585
- 算法竞赛入门经典(第2版)习题3-12 浮点数 Floating-Point Numbers UVa11809
- 算法竞赛入门经典(第2版)习题4-2 正方形 Squares UVa201
- 算法竞赛入门经典(第2版)习题4-4 骰子涂色 Uva253
- 算法竞赛入门经典 习题2答案
- 算法竞赛入门经典 第3章 习题答案