「AOJ再挑戦36~40」の編集履歴(バックアップ)一覧に戻る

AOJ再挑戦36~40 - (2014/01/28 (火) 10:31:49) の編集履歴(バックアップ)


問36 A Figure on Surface

http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0036
おかれたブロックを判定する問題。
解法
ブロックの一番上で一番左のブロックを基準に、その右3マス下3マスのブロックの状態をビットにして判断します。
解いたのでほかの人のコードも見ましたが私は平均的なコードでした。
一位のコードはもはや異次元、数学みたいなコードでなにがなにやら?
MOD演算の概念を使ってる雰囲気だけど読み解けなかった。

#include<stdio.h>
#include<string.h>

char blockType(char test[12][12],int r,int c){
	int pow2=1,sum=0;
	for(int i=0;i<3;i++){
		for(int j=0;j<3;j++){
			if(test[r+i][c+j]=='1'){
				sum+=pow2;
			}
			pow2*=2;
		}
	}
	char re;
	if(sum==27)re='A';
	if(sum==73)re='B';
	if(sum==7)re='C';
	if(sum==9)re='D';
	if(sum==51)re='E';
	if(sum==153)re='F';
	if(sum==11)re='G';
	return re;
}

int main(){
	char board[12][12];
	int r,c;
 	memset(board,0,sizeof(board));
	while(1){
		r=c=-1;
		if(scanf("%s",board[0])==EOF)break;
		for(int i=1;i<8;i++){
			scanf("%s",board[i]);
 			for(int j=8;j<12;j++)board[i][j]='\0';
		}
		
		for(int i=0;i<8;i++){
			for(int j=0;j<8;j++){
 				if(r==-1&&board[i][j]=='1'){
					r=i;
					c=j;
				}
 			}
		}
		printf("%c\n",blockType(board,r,c));
	}
}