

//キャラクター(3人)からマップに存在するポイント(10点)との距離差をキャラクターごとに求め
//その最短距離(最小値)と最長距離(最大値)を返す関数を作成するサンプルソース


#include <stdio.h>	//出力用
#include <math.h>	//距離差算出用(sqrt,pow)

//マクロ
#define CHARA_MAX	3	//キャラクター数
#define POINT_MAX	10	//ポイント数
#define MIN		  0	  //最小値
#define MAX		  1	  //最大値

//関数プロトタイプ宣言
void Init(void);  //初期化

//今回問題とする関数--------------------------------------------------------------------------
int MostValue2(const int Target[], int Rotate, int pattern);
//--------------------------------------------------------------------------------------------------

//構造体
typedef struct
{
	int x, y;

}CHARA;

CHARA chara[CHARA_MAX];    //キャラクター
CHARA point[POINT_MAX];	    //ポイント

//メイン(void main(void)の略でmain() )----------------------------------------------------------------------------
main()
{
	//初期化
	Init();


	//カウント用
	int i, j;

	//最小値、最大値、それ以外の値を出力する用
	int min[CHARA_MAX], max[CHARA_MAX];

	//距離差(二次元配列を用いる)
	int kyori[CHARA_MAX][POINT_MAX];



	//charaとpointの(双方複数存在する)距離差を求めている。---------------------------

	for (i = 0; i < CHARA_MAX; i++)
	{
		for (j = 0; j < POINT_MAX; j++)
		{
			kyori[i][j] = sqrt(pow((chara[i].x - point[j].x), 2.0) + pow((chara[i].y - point[j].y), 2.0));
		}
	}

	//--------------------------------------------------------------------------------

	for (i = 0; i < CHARA_MAX; i++)
	{

		//最小値をminに入れる
		min[i] = MostValue2(kyori[i], POINT_MAX, MIN);

		//最大値をmaxに入れる
		max[i] = MostValue2(kyori[i], POINT_MAX, MAX);

	}

	//〓結果出力〓---------------------------------------------------------------------

	//キャラクター1の場合
	printf("%d,%d,%d\n", min[0], max[0]);
	//キャラクター2の場合
	printf("%d,%d,%d\n", min[1], max[1]);
	//キャラクター3の場合
	printf("%d,%d,%d\n", min[2], max[2]);

	//---------------------------------------------------------------------------------

}


//最小値、最大値を返す関数本体-------------------------------------------------------------------------------------

//◆Target[][]	→	算出元、今回の場合,kyori[CHARA_MAX][POINT_MAX]、
//◆Rotate1,2	→	繰り返し回数、今回の場合CHARA_MAX,POINT_MAX
//◆pattern	→	MINなら最小値、MAXなら最大値、それ以外なら-999を返す(値が返らない可能性があるというエラー防止用)

int MostValue2(const int kyori[], int n, int type) {
	int i;
	int res;
	if(kyori==NULL || n<=0 || (type!=MIN && type!=MAX))return -999;
	res=kyori[0];
	for(i=1;i<n;i++) {
		if((type==MIN && kyori[i]<res) || (type==MAX && kyori[i]>res)) {
			res=kyori[i];
		}
	}
	return res;
}

//初期化-----------------------------------------------------------------------------------------------
void Init()
{
	int i;


	for (i = 0; i < POINT_MAX; i++)
	{
		chara[i].x = 530 + (i * 30);
		chara[i].y = 30;
	}

	point[0].x = 160;
	point[0].y = 250;
	point[1].x = 50;
	point[1].y = 250;
	point[2].x = 160;
	point[2].y = 120;
	point[3].x = 290;
	point[3].y = 80;
	point[4].x = 450;
	point[4].y = 80;
	point[5].x = 290;
	point[5].y = 300;
	point[6].x = 450;
	point[6].y = 300;
	point[7].x = 570;
	point[7].y = 300;
	point[8].x = 570;
	point[8].y = 100;
	point[9].x = 50;
	point[9].y = 420;
	point[10].x = 160;
	point[10].y = 420;
}

#if 0
//補足。◆一次元配列の最小値、最大値を返す関数(原文ではコメントアウトしてある)---------------------------------------------

int MostValue(int *Target, int Rotate, int pattern)
{
	int i;
	int min = Target[0];
	int max = Target[0];

	switch (pattern)
	{
		//最小値を返す
	case 0:

		for (i = 0; i < Rotate; i++)
		{
			if (Target[i] < min)
			{
				min = Target[i];
			}
		}

		return min;

		break;

		//最大値を返す
	case 1:

		for (i = 0; i < Rotate; i++)
		{
			if (Target[i] > max)
			{
				max = Target[i];
			}
		}

		return max;

		break;

	default:
		return -999;


	}


}

#endif
