トップ 差分 一覧 Farm ソース 検索 ヘルプ PDF RSS ログイン

2006ra1.c

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
// 文字型2次元配列を使った方法
// 下方向を北と考えている(コンピュータとy軸は下方向がプラスだから)
main()
{
	int n,m,i,j,x,y,ryo,takara;
	char map[21][21], muki;
	char tmp[100], *p;
	
	while(1){
		// 文字と数字が混在した入力はうまく行かないことが多いので
		// 全部1行ごとに文字列として読み込んでから変換をしている
		fgets(tmp, 100, stdin);
		n=atoi(tmp);
		if(n==0) break;
		
		// 文字型2次元配列で地図(何もない=空白)
		for(j=0; j<=20; j++){
			for(i=0; i<=20; i++){
				map[i][j]=' ';
			}
		}
		
		// 宝石を置いている
		for(i=0; i<n; i++){
			fgets(tmp, 100, stdin);
			sscanf(tmp, "%d %d", &x, &y);
			map[x][y]='*';
		}
		
		fgets(tmp, 100, stdin);
		m=atoi(tmp);
		
		takara=n;
		x=10; y=10;
		for(i=0; i<m; i++){
			fgets(tmp, 100, stdin);
			muki=tmp[0]; // 方向の1文字文を読み込む
			p=tmp; p++;  // 方向の1文字を飛ばして移動量を読み込むため
			ryo=atoi(p);
			for(j=0; j<ryo; j++){
				switch(muki){    // 方向に応じて移動する
					case 'N': y++; break;
					case 'E': x++; break;
					case 'W': x--; break;
					case 'S': y--; break;
				}
				if(map[x][y]=='*'){ // 移動して宝石があったら
					takara--;       // カウントを1減らし
					map[x][y]=' ';  // 地図から宝石を消す
				}
			}
		}
		if(takara==0){   // 全部の宝石を探し終わっていたら
			puts("Yes");
		}else{
			puts("No");
		}
	}
	
	return(0);
}