#include<stdio.h>
#include<conio.h>
#include<Windows.h>

#pragma warning (disable : 4996)

#define domain 20    // 관계행렬의 크기를 위한 상수

// 함수 원형 정의
void readfile(char fn[13], char adjancy[domain + 1][domain + 1]);
void setout(int set_size);
void relationout(int** R, int size);

void main()
{
	int i, j, k, test;   // 관계 연산을 위한 변수 정의
	char fn[] = "pp2-1.DAT";    // 파일 이름
	char adjancymx[domain + 1][domain + 1] = { 0 };   // 관계행렬의 정의 및 초기화

	char reflexity, symmetry, transitivity;   // 반사, 대칭, 추이관계 확인을 위한 변수

	readfile(fn, adjancymx);	   // 파일에서 관계를 읽음 
	setout(domain);	   // 집합 A = {1, 2, 3, ... , 20}을 출력
	relationout(adjancymx, domain);    // 집합 A에 대한 관계 R을 출력

	// R이 반사관계인지 아닌지 확인하고 결과를 출력
	reflexity = 1;
	for (i = 1; i <= domain; i++)
	{
		// iRi가 없으면 바로 반복문을 멈춤
		if (adjancymx[i][i] == 0)
		{
			reflexity = 0;
			break;
		}
	}
	if (reflexity == 1)
	{
		printf("%2cR은 반사관계이다.\n", ' ');
	}
	else
	{
		printf("%2cR은 반사관계가 아니다.\n", ' ');
	}

	// R이 대칭관계인지 아닌지 확인하고 결과를 출력
	symmetry = 1;
	test = 1;
	for (i = 1; i <= domain; i++)
	{
		for (j = 1; j <= domain; j++)
		{
			// iRj가 있을 때 jRi가 없으면 바로 반복문을 멈춤
			if (adjancymx[i][j] == 1 && adjancymx[j][i] == 0)
			{
				symmetry = 0;
				test = 0;
				break;
			}
		}
		if (test == 0)
		{
			break;
		}
	}
	if (symmetry == 1)
	{
		printf("%2cR은 대칭관계이다.\n", ' ');
	}
	else
	{
		printf("%2cR은 대칭관계가 아니다.\n", ' ');
	}

	// R이 추이관계인지 아닌지 확인하고 결과를 출력
	transitivity = 1;
	test = 1;
	for (i = 1; i <= domain; i++)
	{
		for (j = 1; j <= domain; j++)
		{
			if (adjancymx[i][j] == 1)
			{
				for (k = 1; k <= 5; k++)
				{
					// iRj와 jRk가 있고, iRk가 없으면 반복문을 멈춤
					if (adjancymx[j][k] == 1 && adjancymx[i][k] == 0)
					{
						transitivity = 0;		                                      test = 0;
						break;
					}
				}
				if (test == 0)
				{
					break;
				}
			}
		}
		if (test == 0)
		{
			break;
		}
	}
	if (transitivity == 1)
	{
		printf("%2cR은 추이관계이다.\n\n", ' ');
	}
	else
	{
		printf("%2cR은 추이관계가 아니다.\n", ' ');
	}
	system("PAUSE");
}


// readfile 함수를 통해 텍스트 파일에 있는 관계를 읽음
void readfile(char fn[13], char adjancy[domain + 1][domain + 1])
{
	FILE* fp;
	int x, y;
	fp = fopen(fn, "r");
	while (!feof(fp))
	{
		fscanf(fp, "%d %d", &x, &y);
		adjancy[x][y] = 1;
	}
	fclose(fp);
}

// setout 함수가 행렬 mx를 출력
void setout(int set_size) {
	printf("\nA = { ");
	for (int j = 1; j < set_size + 1; j++)
	{
		printf("%d,", j);
	}
	printf("\b }\n\n");
}

// relationout 함수를 통해 관계 R을 출력
void relationout(int R[domain + 1][domain + 1], int size) {
	printf("\nR = { ");
	for (int i = 1; i < size + 1; i++) {
		for (int j = 1; j < size + 1; j++) {
			if (R[i][j] == 1) {
				printf("(%d, %d),", i, j);
			}
		}
	}
	printf("\b }\n\n");
}