「AOJ再挑戦問25~30」の編集履歴(バックアップ)一覧に戻る
AOJ再挑戦問25~30」を以下のとおり復元します。
*問25 Hit and Blow
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0025
2人ゲーム Hit&Blowの判定をする問題。

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

 #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)]);
 	}
 }

復元してよろしいですか?