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