Uva232 Crossword Answers

kian240802發表於2020-10-04
/*
1.因為輸入的兩個整數決定了這一次迴圈要接收的字元數,
所以可以通過判斷第一個數字是否為0來結束輸入。

2. 判斷是否標記數字。whitesquare的左邊或上邊若沒有whitesquare,則可以標上

3.列印時如何判斷一個標號是已經列印還是應該要從他列印起?
	設定記號法不可取,因為across輸出會影響down輸入。
	
	Across: 對於某一行,從第一個開始輸出,直到遇到邊界或者遇到黑格
	Down:  
	如果這個whitesquare的上面不是whitesquare即可要以它為起始 


*/ 

#include<stdio.h>
char words[10][10];
int def[10][10] = {0};

int main(){
	int r,c;
	int index=1;
//	int defcount=1;
	int firstcase=1;
	
	while(scanf("%d",&r) && r!= 0){
		scanf("%d",&c);
		getchar(); //不可忽略 
		for(int i=0; i<r; i++){
			for(int j=0; j<c; j++)
				words[i][j] = getchar();
			getchar();
		}
		

		//處理
		int defcount = 1;
		for(int i=0; i<c; i++){
			if(words[0][i] != '*' )
				def[0][i] = defcount++;
		} 
		
		for(int i=1; i<r; i++){
			for(int j=0; j<c; j++){
				if(j==0){
					if(words[i][j] != '*')
						def[i][j] = defcount++;
					
				}
				else{
					
					if( (words[i-1][j] == '*' || words[i][j-1] == '*')&&(words[i][j] != '*') )//也要求words[i][j]不能為'*' 
						def[i][j] =defcount++;
				}
			}
		}
	
		
		if(!firstcase)
			printf("\n");
		printf("puzzle #%d:\n",index++);
		printf("Across\n");
		
		//橫向輸出
		
		for(int i=0; i<r; i++){
			for(int j=0; j<c; ){
				if(words[i][j] != '*'){
					printf("%3d.",def[i][j]);
					while(words[i][j] != '*'){
						printf("%c",words[i][j]);
				
						j++;
						if(j == c)
							break;
					
					}
					
				printf("\n");
				
			
				
				}
				else j++;
			}
		} 
		
		printf("Down\n");
			
			
		for(int i=0; i<r; i++){
			int idex=i; 
		
			for(int j=0; j<c; j++ ){
			
				if ( (words[i][j] != '*' && i==0 )|| (i!= 0 && words[i-1][j] == '*' && words[i][j] != '*') )  
					{
					printf("%3d.",def[i][j]);
					while(words[i][j] != '*' && i<r){
						printf("%c",words[i][j]);
						i++;
						
					
					}
					printf("\n");
					}
				i = idex;
				
			}
			
			
		}
		
				
		
		firstcase = 0;
	}
	
	
	return 0;
	
	
}