Transformations

/*
ID: fykalv3
LANG: C
TASK: transform
 */
 
#include <stdio.h>
#include <string.h>

typedef char SQ[15][15];
int equal(SQ s1, SQ s2, int n);
int rotate(SQ square, SQ resault, int n);
int reflect(SQ square, SQ resault, int n);
int transform(SQ s1, SQ s2, int n);

int main()
{
	FILE *fin = fopen("transform.in", "r");
	FILE *fout = fopen("transform.out", "w");
	int n, i, j;
	SQ s1, s2;
	fscanf(fin, "%d", &n);
	for (i = 0; i < n; i++)
		fscanf(fin, "%s", s1[i]);
	for (i = 0; i < n; i++)
		fscanf(fin, "%s", s2[i]);
	fprintf(fout, "%d\n", transform(s1, s2, n));
	fclose(fin);
	fclose(fout);
	return 0;
}

int equal(SQ s1, SQ s2, int n)
{
	int i, j;
	for (i = 0; i < n; i++) {
		for (j = 0; j < n; j++) {
			if (s1[i][j] != s2[i][j])
				return 0;
		}
	}
	return 1;
}

int transform(SQ s1, SQ s2, int n)
{
	SQ s = {0}, sq = {0}, squ = {0}, squa = {0};
	rotate(s1, s, n);
	if (equal(s, s2, n))
		return 1;
	rotate(s, sq, n);
	if (equal(sq, s2, n))
		return 2;
	rotate(sq, squ, n);
	if (equal(squ, s2, n))
		return 3;
	reflect(s1, squa, n);
	if (equal(squa, s2, n))
		return 4;
	rotate(squa, s, n);
	if (equal(s, s2, n))
		return 5;
	rotate(s, sq, n);
	if (equal(sq, s2, n))
		return 5;
	rotate(sq, squ, n);
	if (equal(squ, s2, n))
		return 5;
	if (equal(s1, s2, n))
		return 6;
	return 7;
}

int reflect(SQ square, SQ resault, int n)
{
	int i, j, k = n / 2;
	for (i = 0; i < n; i++) {
		for (j = 0; j < k; j++) {
			resault[i][j] = square[i][n-j-1];
			resault[i][n-j-1] = square[i][j];
		}
	}
	k = (n - 1) / 2;
	if (n % 2) {
		for (i = 0; i < n; i++)
			resault[i][k] = square[i][k];
	}
	return 0;
}

int rotate(SQ square, SQ resault, int n)
{
	int i, j;
	for (i = 0; i < n; i++) {
		for (j = 0; j < n; j++) {
			resault[i][j] = square[n-j-1][i];
		}
	}
	return 0;
}



好麻烦,重写一遍过了,之前的代码出了问题,就是旋转和对称的地方注意下公式就行了

你可能感兴趣的:(算法,USACO)