算法竞赛入门经典-习题3-6 纵横字谜的答案(Crossword Answers, ACMICPC World Finals 1994,UVa232)

xiaoxiao2021-02-28  68

习题3-6纵横字谜的答案(Crossword Answers, ACM/ICPC World Finals 1994,UVa232) 输入一个rc列(1≤rc≤10)的网格,黑格用“*”表示,每个白格都填有一个字母。 如果一个白格的左边相邻位置或者上边相邻位置没有白格(可能是黑格,也可能出了网格边界),则称这个白格是一个起始格。首先把所有起始格按照从上到下、 从左到右的顺序编号为1, 2, 3,…,如图3-7所示。

#include<stdio.h>

#include<string.h> int main() { char a[10][10]; int b[10][10]; int r,c; int Num = 1; int i,j; while(scanf("%d",&r)!=EOF && r) { scanf("%d",&c); printf("puzzle #%d:\n",Num++); for(i = 0; i < r; i++) { scanf("%s",a[i]); } int n = 1; memset(b,0,sizeof(b)); for(i = 0; i < r; i ++) { for(j = 0; j < c; j++) { if((i == 0 || j == 0 || a[i-1][j] == '*' || a[i][j-1] == '*') && a[i][j] != '*') { b[i][j] = n++; } } } printf("Across"); for(i = 0; i < r; i++) int flag = 1; for(j = 0; j < c; j++) { if(a[i][j] != '*') { if(flag) { printf("\n  %d.",b[i][j]); printf("%c",a[i][j]); flag = 0; } else { printf("%c",a[i][j]); } } if(a[i][j] == '*' || j == (c-1)) { flag = 1; } } } printf("\nDown"); for(i = 0; i < r; i++) { for(j = 0; j < c; j++) { if(b[i][j]) { printf("\n  %d.",b[i][j]); printf("%c",a[i][j]); for(int x = i + 1, int y = j; x < r; x++) { if(a[x][y] != '*') { printf("%c",a[x][y]); b[x][y] = 0; } else { break; } } } } } printf("\n"); } return 0; }
转载请注明原文地址: https://www.6miu.com/read-47936.html

最新回复(0)