※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

「AOJ131~140」の編集履歴(バックアップ)一覧に戻る
AOJ131~140」を以下のとおり復元します。
----
*0131 Doctor's Strange Particles
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0131
3年ほど前にライツアウトの賢い解法というのを読んだことがあった。
それは最上段だけ組み合わせを試せば後の段は自動的に決まるというものだった。
それを覚えていたのでそのまま実装。
行列を使うもっと賢い方法は理解できなかったのでパス。


 #include<stdio.h>
 int map[10][10];
 int ans[10][10];
 int dxs[]={0,1,0,-1,0};
 int dys[]={0,0,1,0,-1};
 bool goal;
 void push(int x,int y){
	int nx,ny;
	for(int i=0;i<5;i++){
		nx=x+dxs[i];
		ny=y+dys[i];
		if(nx<0 || 9<nx || ny<0 || 9<ny)continue;
		map[ny][nx]=map[ny][nx]==1?0:1;
	}
	ans[y][x]=ans[y][x]==1?0:1;
 }
 void saiki(int deep){
	if(deep==100){
		for(int i=0;i<10;i++){
			if(map[9][i]==1){
				return;
			}
		}
		goal=true;
		return ;
	}
	
	int x=deep%10;
	int y=deep/10;
	if(y==0){	
		saiki(deep+1);
		if(goal) return;
		
		push(x,y);
		
		saiki(deep+1);
		if(goal) return;
		
		push(x,y);
	}else{
		if(map[y-1][x]==1){
			push(x,y);
		}
		saiki(deep+1);
		if(goal)return;
	}
 }
 void setMap(){
	for(int i=0;i<100;i++){
		scanf("%d",&map[i/10][i%10]);
		ans[i/10][i%10]=0;
	}
	goal=false;
	saiki(0);
	for(int i=0;i<10;i++){
		for(int j=0;j<10;j++){
			printf("%s%d",j==0?"":" ",ans[i][j]);
		}
		printf("\n");
	}
 }
 int main(){
	int n;
	scanf("%d",&n);
	while(n--){
		setMap();
	}
 }







----
*0132 Jigsaw Puzzle
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0132
この問題ちょっと組み合わせ数多すぎないか?
意外と制限がきついから小さくなるのかな?
愚直に全探索する方法以外考えついてないのだけど?
回す時は縦横で大きなほうにサイズを合わせるべきか?
縦に回して試す時と横に回して試す時でチェック領域が変わるのは少しめんどうそう。





----
*0133 Rotation of a Pattern
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0133
上の問題からみたら嘘のように簡単な問題。
文字が2種類しかないだの8*8ということはbit演算でも期待されているのだろうか?


 #include<stdio.h>
 #include<string.h>
 void round(char a[8][9],int r){
	char b[8][9];
	for(int i=0;i<64;i++){
		b[i%8][7-i/8]=a[i/8][i%8];
		b[i/8][8]='\0';
	}
	memcpy(a,b,72);
	printf("%d\n",r);
	for(int i=0;i<8;i++){
		printf("%s\n",a[i]);
	}
 }
 int main(){
	char a[8][9];
	for(int i=0;i<8;i++)scanf("%s",a[i]);
	round(a,90);
	round(a,180);
	round(a,270);
 }




----
*0134 Ehttp://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0134xit Survey

うーん出題形式に慣れるための肩慣らし問題だなきっと。

 #include <iostream>
 int main(){
    long long int sum=0,m,n;
    std::cin>>n;
    for(int i=0;i<n;i++){
        std::cin>>m;
        sum+=m;
    }
    std::cout<<sum/n<<"\n";
 }




----
*0135 Clock Short Hand and Long Hand
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0135
0.5度を1単位とすると簡単に解ける。


 #include<stdio.h>
 #include<stdlib.h>
 int main(){
	int n,r1,r2,r;
	scanf("%d",&n);
	while(n--){
		scanf("%d:%d",&r1,&r2);
		r=abs(r1*60-r2*11);
		r=r>360?720-r:r;
		printf("%s\n",r<60?"alert":r<180?"warning":"safe");
	}
 }



----
*0136 Frequency Distribution of Height
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0136
ただ書くだけ。

 #include <stdio.h>
 int main(void)
 {
	int n;
	int sum[6];
	scanf("%d",&n);
	for(int i=0;i<6;i++){
		sum[i]=0;
	}
	double h;
	for(int i=0;i<n;i++){
		scanf("%lf",&h);
		if(h<165.0){
			sum[0]++;
		}else if(h>=185.0){
			sum[5]++;
		}else{
			sum[((int)(h-165.0))/5+1]++;
		}
	}
	for(int i=0;i<6;i++){
		printf("%d:",i+1);
		for(int j=0;j<sum[i];j++){
			printf("*");
		}
		printf("\n");
	}
	return 0;
 }




----
*0137 Middle-Square Method
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0137
ただ書くだけ。

 #include<stdio.h>
 void calc(int m){
	int x;
	for(int i=0;i<10;i++){
		m=((m*m)/100)%10000;
		printf("%d\n",m);
	}
 }
 int main(){
	int n,m;
	scanf("%d",&n);
	for(int i=0;i<n;i++){
		scanf("%d",&m);
		printf("Case %d:\n",i+1);
		calc(m);
	}
 }


----
*0138 Track and Field Competition
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0138
ただMapに放り込むだけ

 #include<stdio.h>
 #include<map>
 std::map<double,int> third;
 std::map<double,int>::iterator it;
 void calc(){
	std::map<double,int> tops;
	int no;
	double time;
	for(int i=0;i<8;i++){
		scanf("%d %lf",&no,&time);
		tops[time]=no;
	}
	it=tops.begin();
	for(int i=0;i<2;i++){
		printf("%d %.2lf\n",(*it).second,(*it).first);
		it++;
	}
	third[(*it).first]=(*it).second;
 }
 int main(){
	calc();
	calc();
	calc();
	it=third.begin();
	for(int i=0;i<2;i++){
		printf("%d %.2lf\n",(*it).second,(*it).first);
		it++;
	}
 }






----
*0139  Snakes
最初は蛇のデータを読んで状態遷移マシーンでAかBかを判別して合格したのだけど
他の方のブログで、最初に蛇の全状態を作ってそこから照合するという方を見て納得。
こちらのコードを書いてみた。
書いてみて分かったけどAとBの蛇のパタンがたった200通りしかなくほぼ線形的に全パタンを網羅できるのには気付かなかった。


 #include<stdio.h>
 #include<string>
 #include<set>
 std::set<std::string> snakesA;
 std::set<std::string> snakesB;
 void creatSnake(){
	char snake[201];
	int n;
	snake[0]='>';
	snake[1]='\'';
	for(int j=1;j<99;j++){
		snake[3+j*2]='~';
		snake[4+j*2]='\0';
		snake[j+1]=snake[2+j*2]=snake[1+j*2]='=';
		snake[j+2]='#';
		snakesA.insert((std::string)snake);
	}
	snake[1]='^';
	
	for(int j=1;j<99;j++){
		snake[j*2]='Q';
		snake[j*2+1]='=';
		snake[j*2+2]=snake[j*2+3]='~';
		snake[j*2+4]='\0';
		snakesB.insert((std::string)snake);
	}
 }
 int main(){
	creatSnake();
	int n;
	char snake[201];
	scanf("%d",&n);
	while(n--){
		scanf("%s",snake);
		if(snakesA.find(snake)!=snakesA.end()){
			printf("A\n");
		}else if(snakesB.find(snake)!=snakesB.end()){
			printf("B\n");
		}else{
			printf("NA\n");
		}
	}
 }

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