天天看點

USACO 1.2 Transformations (用結構體來模拟)

<pre name="code" class="cpp">#include <stdio.h>
#define DEBUG 0
#define TESTCASES 8

#define MAX 10
//結構體可當形參,跟數組一樣退化為指針,還可以直接指派
typedef struct Square{
    int size;
    char arrayOfChars[MAX + 1][MAX + 1];
}Square;
Square initialSquare;
Square finalSquare;

Square rotateClockwise90(Square square){
    Square squareTransformed;
    squareTransformed.size = square.size;
    int row, column;
    for (row = 0; row < square.size; row++)
        for (column = 0; column < square.size; column++)
            squareTransformed.arrayOfChars[column][square.size - 1 - row] = square.arrayOfChars[row][column];
    //可傳回結構體當其他函數的形參
	return squareTransformed;
}

Square reflect(Square square){
    Square squareTransformed;
    squareTransformed.size = square.size;
    int row, column;
    for (row = 0; row < square.size; row++)
        for (column = 0; column < square.size; column++)
            squareTransformed.arrayOfChars[row][square.size - 1 - column] =
            square.arrayOfChars[row][column];
    return squareTransformed;
}

int compare(Square squareTransformed){
    if (squareTransformed.size != finalSquare.size)
        return 0;
    int row, column;
    for (row = 0; row <squareTransformed.size; row++)
        for (column = 0; column < squareTransformed.size; column++)
            if (squareTransformed.arrayOfChars[row][column] != finalSquare.arrayOfChars[row][column])
                return 0;
    return 1;
}

int main(){
#if DEBUG
	int testCase;
	for (testCase = 1; testCase <= TESTCASES; testCase++){
		char inputFileName[20] = "inputX.txt";
		inputFileName[5] = '1' +  (testCase - 1);
		freopen(inputFileName, "r", stdin);
		printf("\n#%d\n", testCase);
#endif

    int size;
    scanf("%d", &size);
    initialSquare.size = size;
    finalSquare.size = size;

    int row;
    for (row = 0; row < size; row++)
		//注意輸入字元串一定是從arrayOfChars[row][0],不是arrayOfChars[row][1]開始存儲
		//為了對稱,row也要從0開始輸入
        scanf("%s", initialSquare.arrayOfChars[row]);

    for (row = 0; row < size; row++)
        scanf("%s", finalSquare.arrayOfChars[row]);

	//用來緩存變換過程中的圖形,避免重複計算
    Square bufferSquare;
    int transformation;
    if ( compare( bufferSquare = rotateClockwise90(initialSquare) ) == 1 )
        transformation = 1;
    else if ( compare( bufferSquare = rotateClockwise90(bufferSquare) ) == 1 )
        transformation = 2;
    else if ( compare( bufferSquare = rotateClockwise90(bufferSquare) ) == 1 )
        transformation = 3;
    else if ( compare( bufferSquare = reflect(initialSquare) ) == 1)
        transformation = 4;
    else if ( (compare( bufferSquare = rotateClockwise90(bufferSquare) ) == 1) ||
              (compare( bufferSquare = rotateClockwise90(bufferSquare) ) == 1) ||
              (compare( bufferSquare = rotateClockwise90(bufferSquare) ) == 1) )
        transformation = 5;
    else if (compare(initialSquare) == 1)
        transformation = 6;
    else
        transformation = 7;

    printf("%d\n", transformation);

#if DEBUG
	}
#endif
	return 0;
}