UVa - 232 - Crossword Answers

题目链接:https://vjudge.net/problem/UVA-232(VJ)

https://vjudge.net/problem/32396/origin(UVaOJ)

AC代码:

#include<stdio.h>
#include<iostream>
#include<string>
#include<cstring>
#include<algorithm>
using namespace std;
void output(int k)
{
    printf("puzzle #%d:\n",k);
}
int main()
{
    int r,c,k=1,n,z;
    char cha[11][11];
    int num[11][11];
    while(scanf("%d",&r)!=EOF&&r)
    {
        memset(num,0,sizeof(num));
        n=1;
        scanf("%d",&c);
        for(int i=0;i<r;i++)
            scanf("%s",cha[i]);
        if(k>1)
            cout<<endl;
        output(k++);
        for(int i=0;i<r;i++){
            for(int j=0;j<c;j++){
                if(i==0&&cha[i][j]!='*')
                {
                    num[i][j]=n++;
                    continue;
                }
                if(j==0&&cha[i][j]!='*')
                {
                    num[i][j]=n++;
                    continue;
                }
                if(cha[i-1][j]=='*'||cha[i][j-1]=='*')
                {
                    if(cha[i][j]!='*')
                    {
                        num[i][j]=n++;
                        continue;
                    }
                }
            }
        }
        //Across
        printf("Across\n");
        for(int i=0;i<r;i++){
            int t=0;
            for(int j=0;j<c;j++){
                if(cha[i][j]=='*'){
                    t=0;
                    continue;
                }
                if(t==0)
                {
                    printf(" %2d.",num[i][j]);
                    t=1;
                }
                cout<<cha[i][j];
                if(cha[i][j+1]=='*'||j+1==c)
                    cout<<endl;
            }
        }
        //Down
        printf("Down\n");
        for(int i=0;i<r;i++){
            for(int j=0;j<c;j++){
                if(i==0&&cha[i][j]!='*'){
                        printf(" %2d.",num[i][j]);
                        z=i;
                        while(cha[z][j]!='*'&&z!=r){
                                cout<<cha[z][j];
                                z++;
                        }
                        cout<<endl;
                }
                else if(cha[i-1][j]=='*'&&cha[i][j]!='*'){
                    printf(" %2d.",num[i][j]);
                    z=i;
                    while(cha[z][j]!='*'&&z!=r){
                        cout<<cha[z][j];
                        z++;
                    }
                    cout<<endl;
                    continue;
                }
            }
        }
    }
    return 0;
}
View Code

解题思路:

        1输入行列数

        2输入矩阵中的每个值

        3对矩阵中每个值所对应的数字进行记录,两种白色矩阵被数字顺序记录的规则,一是黑色矩阵在白色矩阵的左方或者上方,二是白色矩阵的左边或者上面没有矩阵

        4输出Across,这个较为简单,只需按序输出即可,因为横向输出list和数字的顺序刚好一致

        5输出Down,这个有点复杂,因为需要按数字序输出每一个,我的方法是一行一行的查找,找到可以输出的,然后纵向输出,直到本列结束或者碰到黑色方格

注意:

         Separate output for successive input puzzles by a blank line.

        对于连续的输入问题,要把输入和输出用空格分开,注意successive意思是第一个输出和输入不分开,因为第二个开始才能算为successive

posted @ 2018-07-05 20:00  子诚-  阅读(255)  评论(0编辑  收藏  举报