ALGORITHM/USACO

Solving the usaco transform problem in c++

Woogamza 2019. 8. 11. 22:27
728x90

오래걸렸다.

첫째. 입력을 받는 방식을 완전히 마스터 하지 못했다.

둘째. c++에서 array를 다루는 부분이 매우 약했다.

 

char**, char[][],vector, string[], string*를 쓰며 계속계속 배열 범위를 초과하는 문제를 해결해나갔다.

 

#include <fstream>
#include <string>
using namespace std;

bool check(string* input, string* mirror, int N) {
	for (int i = 0; i < N; i++) {
		for (int j = 0; j < N; j++) {
			if (input[i][j] != mirror[i][j])
				return false;
		}
	}
	return true;
}

string* rot(string* input, int N) {
	string* dummy = new string[N];
	for (int i = 0; i < N; i++) {
		dummy[i] = input[i];
	}
	for (int i = 0; i < N; i++) {
		for (int j = 0; j < N; j++) {
			dummy[j][N - i - 1] = input[i][j];
		}
	}
	return dummy;
}
string* reflect(string* input, int N) {
	string* dummy = new string[N];
	for (int i = 0; i < N; i++) {
		dummy[i] = input[i];
	}
	for (int i = 0; i < N; i++) {
		for (int j = 0; j < N; j++) {
			dummy[i][N - j - 1] = input[i][j];
		}
	}
	return dummy;
}

int main() {
	ofstream fout("transform.out");
	ifstream fin("transform.in");
	int N;
	string x;
	string* num1;
	string* num2;
	string* num3;
	string* num4;
	string* num5_1;
	string* num5_2;
	string* num5_3;
	fin >> N;
	string input[13];
	string mirror[13];
	for (int i = 0; i < N; i++) {
		fin >> x;
		input[i] = x;
	}
	for (int i = 0; i < N; i++) {
		fin >> x;
		mirror[i] = x;
	}
	num1 = rot(input, N);
	num2 = rot(num1, N);
	num3 = rot(num2, N);
	num4 = reflect(input, N);
	num5_1 = reflect(num1, N);
	num5_2 = reflect(num2, N);
	num5_3 = reflect(num3, N);
	if (check(num1, mirror, N)) { //90
		fout << 1 << endl;
	}
	else if (check(num2, mirror, N)) {
		fout << 2 << endl;
	}
	else if (check(num3, mirror, N)) {
		fout << 3 << endl;
	}
	else if (check(num4, mirror, N)) {
		fout << 4 << endl;
	}
	else if (check(num5_1, mirror, N)) {
		fout << 5 << endl;
	}
	else if (check(num5_2, mirror, N)) {
		fout << 5 << endl;
	}
	else if (check(num5_3, mirror, N)) {
		fout << 5 << endl;
	}else if (check(input, mirror, N)) {
		fout << 6 << endl;
	}
	else {
		fout << 7 << endl;
	}
	return 0;
}