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

AOJ再挑戦問25~30 - (2014/01/11 (土) 10:31:18) の編集履歴(バックアップ)


問25 Hit and Blow

http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0025
2人ゲーム Hit&Blowの判定をする問題。

解法
同じ数字がないので4*4検証して同じ数ならHitかBlowしかありません。
同じ場所でないならBlowです、同じ場所ならHitです。
同じ数字が許容されるとこの問題判定が少し難しくなりますね。

#include<stdio.h>
int main(){
 	int as[4],bs[4];
	while(scanf("%d %d %d %d",&as[0],&as[1],&as[2],&as[3])!=EOF){
		scanf("%d %d %d %d",&bs[0],&bs[1],&bs[2],&bs[3]);
		int hit=0;
 		int blow=0;
		for(int i=0;i<4;i++){
			for(int j=0;j<4;j++){
				if(i!=j){
					blow+=(as[i]==bs[j]);
				}else{
 					hit+=(as[i]==bs[j]);
				}
			}
		}
		printf("%d %d\n",hit,blow);
	}
}



問26 Dropping Ink

http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0026
ペーパーにインクを落とした後の結果をこたえる問題。

解法
そのままシミュレートします。
ペーパー上下左右をそれぞれ2マスを大きくして実際に垂らしたポイントをx+2,y+2とし、2~11マス目までを集計する事で外側判定処理を省いています。


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

int paper[15][15];
const int slide=2;

void small(int x,int y){
	paper[x+1][y]++;
	paper[x][y+1]++;
	paper[x-1][y]++;
	paper[x][y-1]++;
	paper[x][y]++;
}
void middle(int x,int y){
	paper[x+1][y+1]++;
	paper[x+1][y-1]++;
	paper[x-1][y+1]++;
	paper[x-1][y-1]++;
	small(x,y);
}
void big(int x,int y){
	paper[x+2][y]++;
	paper[x][y+2]++;
	paper[x-2][y]++;
	paper[x][y-2]++;
	middle(x,y);	
} 

 
int main(){
	memset(paper,0,sizeof(paper));
	int x,y,s;
 	while(scanf("%d,%d,%d",&x,&y,&s)!=EOF){
		x+=slide;
		y+=slide;
		if(s==3)big(x,y);
		if(s==2)middle(x,y);
 		if(s==1)small(x,y);
	}
	int ansA=0,ansB=0;
	for(int x=0;x<10;x++){
		int x1=x+slide;
 		for(int y=0;y<10;y++){
			int y1=y+slide;
			if(paper[x1][y1]>ansB)ansB=paper[x1][y1];
			if(paper[x1][y1]==0)ansA++;
		}
	}
	printf("%d\n%d\n",ansA,ansB);
}




問27 What day is today?


解法
ツェラーの公式で一発です。



#include<stdio.h>
char weeks[7][10]={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};
int getWeekday(int nYear, int nMonth, int nDay)
{
	//ツェラーの公式という有名な曜日判定プログラム
   int nWeekday, nTmp;

   if (nMonth == 1 || nMonth == 2) {
       nYear--;
       nMonth += 12;
   }

   nTmp     = nYear/100;
   nWeekday = (nYear + (nYear >> 2) - nTmp + (nTmp >> 2) + (13*nMonth + 8)/5 + nDay) % 7;

   return nWeekday;
}

int main(){
 	while(1){
		int m,d;
		scanf("%d %d",&m,&d);
 		if(m==0&&d==0)break;
		printf("%s\n",weeks[getWeekday(2004,m,d)]);
	}
}