トップ 一覧 Farm 検索 ヘルプ RSS ログイン

2003dc1.cの変更点

  • 追加された行はこのように表示されます。
  • 削除された行はこのように表示されます。
 // 2003 domestic C
 // 秘密の数字を整数型で保持した(これじゃダメ)
 // 秘密の数字がunsigned long型の範囲内だと解ける
 // 文字列で保存するようにする。
 // 大小比較ができるようにしないといけない
 
 #include <stdio.h>
 #include <ctype.h>
 #include <string.h>
 
 #define ON  1
 #define OFF 0
 
 #define XX 70
 #define YY 70
 
 #define NUM(x) (x-'0')
 
 void clear(void);
 void print(int w, int h);
 void search(int x, int y, char k[XX]);
 void add(char s[XX], char ch);
 
 void push(char *w);
 void pop(char *w);
 
 int sp=0;	 // スタックポインタ
 char st[100][XX]; // スタック
 
 char m[XX][YY];
 int w,h;
 char num[XX*YY][XX]; // 秘密の数字を保持しておく変数
 size_t count, lenlen;
 
 int main(void)
 {
 	int j,x,y,z;
 	int flag;
 	char k[XX];
 	char secret[XX], num2[XX*YY][XX];
 	size_t p, i, len, count2;
 	int max, maxi, sum;
 	
 	while(1){
 		scanf("%d %d", &w, &h);
 		if(w==0 && h==0) break;
 		
 		clear();
 		
 		// input data
 		for(j=0; j<h; j++){
 			scanf("%s", m[j]);
 			m[j][w]='x';
 		}
 //		print(w, h);
 		
 		count=0;
 		lenlen=0;
 		for(y=0; y<w; y++){
 			for(x=0; x<w; x++){
 				if('1'<=m[y][x] && m[y][x]<='9'){
 					printf("\n%c\n", m[y][x]);
 					k[0]=m[y][x];
 					k[1]='\0';
 					search(x, y, k);
 				}
 			}
 		}
 		
 //		printf("\n");
 		
 		// まず秘密の数字の最長の長さを求める
 		len=0;
 		for(i=0; i<count; i++){
 //			printf("%2d:%s\n", i, num[i]);
 			if(len<strlen(num[i])){
 				len=strlen(num[i]);
 			}
 		}
 		
 		// 最長の長さと同じ数字を表示
 		count2=0;
 		for(i=0; i<count; i++){
 			if(strlen(num[i])==len){
 //				printf(" %2d:%s\n", i, num[i]);
 				strcpy(num2[count2++], num[i]);
 			}
 		}
 		
 		// 最大を見つける
 		for(p=0; p<strlen(num2[i]); p++){
 			max=0;
 			maxi=0;
 			for(i=0; i<count2; i++){
 				if(max<NUM(num2[i][p])){
 					max=NUM(num2[i][p]);
 					maxi=i;
 				}
 			}
 			sum=0;
 			for(i=0; i<count2; i++){
 				if(max==NUM(num2[i][p])){
 					sum++;
 				}
 			}
 			if(sum==1) break;
 		}
 //		printf("secret number=%s\n", num2[maxi]);
 		printf("%s\n", num2[maxi]);
 //		printf("\n");
 	}
 	return 0;
 }
 
 void push(char *w)
 {
 	strcpy(st[sp++], w);
 }
 
 void pop(char *w)
 {
 	strcpy(w, st[--sp]);
 }
 
 
 void add(char s[XX], char ch)
 {
 	char tmp[2];
 	
 	tmp[0]=ch;
 	tmp[1]='\0';
 	strcat(s, tmp);
 }
 
 void search(int x, int y, char k[XX])
 {
 	/*
 	if(!isdigit(m[y][x])){
 		printf("数字じゃなかった??:(%d,%d)=%c %s\n", x, y, m[y][x], k);
 	}else
 	*/
 	
 	if( isdigit(m[y][x+1]) && !isdigit(m[y+1][x])){ // 右だけ数字
 		add(k, m[y][x+1]);
 //		printf("1: (%d,%d)=%c %s\n", x, y, m[y][x], k);
 		search(x+1, y, k);
 	}else if(!isdigit(m[y][x+1]) &&  isdigit(m[y+1][x])){ // 下だけ数字
 //		printf("2: (%d,%d)=%c %s\n", x, y, m[y][x], k);
 		add(k, m[y+1][x]);
 		search(x, y+1, k);
 	}else if( isdigit(m[y][x+1]) &&  isdigit(m[y+1][x])){ // 右と下が数字
 //		printf("3: (%d,%d)=%d %s\n", x, y, NUM(m[y][x]), k);
 		push(k);
 		add(k, m[y][x+1]);
 		search(x+1, y, k);
 		
 		pop(k);
 		add(k, m[y+1][x]);
 		search(x, y+1, k);
 	}else{ // 右と下が数字じゃない
 		if(lenlen<=strlen(k)){
 			lenlen=strlen(k);
 //			printf("数字じゃなかった:(%d,%d)=%c %s\n", x, y, m[y][x], k);
 			strcpy(num[count++], k);
 		}
 	}
 }
 
 
 void clear(void)
 {
 	int x,y;
 	
 	for(y=0; y<YY; y++){
 		for(x=0; x<XX; x++){
 			m[y][x]='x';
 		}
 	}
 }
 
 void print(int w, int h)
 {
 	int x,y;
 	
 	printf("w=%d h=%d\n", w, h);
 	
 	for(y=0; y<h+1; y++){
 		for(x=0; x<w+1; x++){
 			printf("%c ", m[y][x]);
 		}
 		printf("\n");
 	}
 	printf("\n");
 }
 }