縱橫字謎的答案(Crossword Answers)


題目

輸入一個r行c列(1<=r, c<=10)的網格,黑格用 * 表示,每個白格都填有一個字母。

如果一個白格的左邊相鄰位置或者上邊相鄰位置沒有白格(可能是黑格,也可能出了網格邊界),

則稱這個白格是一個起始格。

首先把所有起始格按照從上到下,從左到右的順序編號為1,2,3,... ,如圖

 

 

 接下來要找出所有橫向單詞(Across)。這些單詞必須從一個起始格開始,

向右延伸到一個黑格的左邊或者整個網格的最右邊列。最后找出所有的豎向單詞(Down)。

這些單詞必須從一個起始格開始,向下延伸到一個黑格的上邊或者整個網格的最下行。

輸入樣例

2 2
AT
*O
6 7
AIM*DEN
*ME*ONE
UPON*TO
SO*ERIN
*SA*OR*
IES*DEA
0

樣例輸出

puzzle #1:
Across
  1.AT
  3.O
Down
  1.A
  2.TO

puzzle #2:
Across
  1.AIM
  4.DEN
  7.ME
  8.ONE
  9.UPON
 11.TO
 12.SO
 13.ERIN
 15.SA
 17.OR
 18.IES
 19.DEA
Down
  1.A
  2.IMPOSE
  3.MEO
  4.DO
  5.ENTIRE
  6.NEON
  9.US
 10.NE
 14.ROD
 16.AS
 18.I
 20.A

分析

用s[][] 存儲r行c列的字符,lable[][]用來標記對應位置起始格的編號;

1.檢測起始格

2.檢測橫向單詞和豎向單詞

 

c實現

#include<stdio.h>
#include<string.h>
#define maxn 12

int main(){
    //r行,c列 
    int r,c;
    
    while(scanf("%d",&r)&&r){
        scanf("%d",&c);
        char s[r][c];
        //依次輸入每行的數據 
        for(int i=0;i<r;i++)
        {
            scanf("%s",s[i]);
        }
        //用來標記起始格的序號1,2,... 
        int lable[r][c];
        int count=0;
        //檢測標記對應位置的起始格 
        for(int i=0;i<r;i++){
            for(int j=0;j<c;j++)
            {
                //起始格:首先不是黑格,然后為邊界或者(左邊相鄰位置或者上邊相鄰位置沒有白格) 
                if(s[i][j]!='*'&&(i==0||j==0||s[i-1][j]=='*'||s[i][j-1]=='*'))
                {
                    lable[i][j] = (++count);
                }else{
                    lable[i][j] = 0;//非起始格標記為0 
                }
            }
        }
        
        //橫向輸出 
        printf("Across\n");
        for(int i=0;i<r;i++)
        {
            for(int j=0;j<c;j++)
            {
                //橫向單詞滿足的條件:首先該位置是起始格,然后左邊界或左邊相鄰位置為黑格 
                if(lable[i][j]>0&&(j==0||s[i][j-1]=='*'))
                {
                    printf("%d.%c",lable[i][j],s[i][j]);
                    for(int k=j+1;k<c;k++){
                        if(s[i][k]=='*'){
                            break;
                        }else{
                            printf("%c",s[i][k]);
                        }
                    }
                    printf("\n");
                }
            }
        }
        printf("Down\n");
        for(int i=0;i<r;i++){
            for(int j=0;j<c;j++){
                //豎向單詞滿足的條件:首先該位置是起始格, 然后為上邊界或者上邊相鄰位置為黑格 
                if(lable[i][j]>0&&(i==0||s[i-1][j]=='*'))
                {
                    printf("%d.%c",lable[i][j],s[i][j]);
                    for(int k=i+1;k<r;k++){
                        if(s[k][j]=='*'){
                            break;
                        }else{
                            printf("%c",s[k][j]);
                        }
                    }
                    printf("\n");
                }
            }
        }
    }
    
    return 0;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM