「AOJ再挑戦36~40」の編集履歴(バックアップ)一覧はこちら
AOJ再挑戦36~40 - (2014/01/28 (火) 10:31:49) の1つ前との変更点
追加された行は緑色になります。
削除された行は赤色になります。
*問36 A Figure on Surface
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0036
おかれたブロックを判定する問題。
解法
ブロックの一番上で一番左のブロックを基準に、その右3マス下3マスのブロックの状態をビットにして判断します。
解いたのでほかの人のコードも見ましたが私は平均的なコードでした。
一位のコードはもはや異次元、数学みたいなコードでなにがなにやら?
#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));
}
}
*問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));
}
}