(UVA)232

来源:互联网 发布:淘宝网首页小音箱 编辑:程序博客网 时间:2024/06/08 17:30





题意:输入一个r行c列(1≤r,c≤10)的网格,黑格用“*”表示,每个白格都填有一个字母。如果一个白格的左边相邻位置或者上边相邻位置没有白格(可能是黑格,也可能出了网格边界),则称这个白格是一个起始格。 首先把所有起始格按照从上到下、从左到右的顺序编号为1, 2, 3,…,如图所示接下来要找出所有横向单词(Across)。这些单词必须从一个起始格开始,向右延伸到一个黑格的左边或者整个网格的最右列。最后找出所有竖向单词(Down)。这些单词必须从一个起始格开始,向下延伸到一个黑格的上边或者整个网格的最下行。输入输出格式和样例请参考原题。


贴一个别人的代码(留坑):

#include <bits/stdc++.h>using namespace std;const int N = 10;int main(){    int t = 0;    int n, m;    char s[N][N+1];    int cnt = 0;    int pos[N*N+1][2];    while (scanf("%d", &n) != EOF && n) {        scanf("%d", &m);        getchar();        cnt = 0;        memset(pos, 0, sizeof(pos));        for (int i = 0; i < n; i ++) {            for (int j = 0; j < m; j ++) {                s[i][j] = getchar();                if (s[i][j] == '*') continue;                if (i == 0 || j == 0 || s[i-1][j] == '*' || s[i][j-1] == '*') {                    pos[cnt][0] = i, pos[cnt][1] = j;                    cnt ++;                }            }            getchar();        }        if (t > 0) printf("\n");        printf("puzzle #%d:\n", ++t);        printf("Across\n");        for (int k = 0; k < cnt; k ++) {            int i = pos[k][0], j = pos[k][1];            if (j > 0 && s[i][j-1] != '*') continue;            printf("%3d.", k+1);            do {                printf("%c", s[i][j]);                j ++;            } while (j < m && s[i][j] != '*');            printf("\n");        }        printf("Down\n");        for (int k = 0; k < cnt; k ++) {            int i = pos[k][0], j = pos[k][1];            if (i > 0 && s[i-1][j] != '*') continue;            printf("%3d.", k+1);            do {                printf("%c", s[i][j]);                i ++;            } while (i < n && s[i][j] != '*');            printf("\n");        }    }    return 0;}


0 0
原创粉丝点击