題目
輸入一個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; }