原题链接:https://vjudge.net/problem/UVA-232
分类:字符串、数组
备注:水题
思路:根据题意做就好了,先遍历数组把每个起始白格编号,再实现每个单词的输出。
代码如下:
#include<stdio.h>
int r, c, kase;
char s[20][20];
inline char read()
{
char ch = getchar();
while (ch == ' ' || ch == '\n')ch = getchar();
return ch;
}
int check(int i, int j)
{
if (s[i][j] == '*')return 0;
if (i == 1 || j == 1 || s[i - 1][j] == '*' || s[i][j - 1] == '*')return 1;
return 0;
}
int main(void)
{
while (scanf("%d%d", &r, &c) == 2 && r)
{
for (int i = 1; i <= r; i++)
for (int j = 1; j <= c; j++)
s[i][j] = read();
int cnt = 0, no[20][20] = { 0 };
for (int i = 1; i <= r; i++)
for (int j = 1; j <= c; j++)
if (check(i, j))cnt++, no[i][j] = cnt;
if (kase)printf("\n");
printf("puzzle #%d:\nAcross\n", ++kase);
for (int i = 1; i <= r; i++)
for (int j = 1; j <= c; j++)
if ((j == 1 || s[i][j - 1] == '*') && s[i][j] != '*')
{
printf("%3d.", no[i][j]);
while (j <= c && s[i][j] != '*') printf("%c", s[i][j]), j++;
printf("\n");
}
printf("Down\n");
for(int i=1;i<=r;i++)
for(int j=1;j<=c;j++)
if ((i == 1 || s[i - 1][j] == '*') && s[i][j] != '*')
{
printf("%3d.", no[i][j]);
for (int k = i; k <= r && s[k][j] != '*'; k++)printf("%c", s[k][j]);
printf("\n");
}
}
return 0;
}