Translate:USACO/transformTransformations 方塊轉(zhuǎn)換
[編輯]描述一塊N x N(1<=N<=10)正方形的黑白瓦片的圖案要被轉(zhuǎn)換成新的正方形圖案,。寫一個程序來找出將原始圖案按照以下列轉(zhuǎn)換方法轉(zhuǎn)換成新圖案的最小方式: 1:轉(zhuǎn)90度:圖案按順時針轉(zhuǎn)90度,。 2:轉(zhuǎn)180度:圖案按順時針轉(zhuǎn)180度,。 3:轉(zhuǎn)270度:圖案按順時針轉(zhuǎn)270度,。 4:反射:圖案在水平方向翻轉(zhuǎn)(以中央鉛垂線為中心形成原圖案的鏡像)。 5:組合:圖案在水平方向翻轉(zhuǎn),,然后再按照1到3之間的一種再次轉(zhuǎn)換,。 6:不改變:原圖案不改變。 7:無效轉(zhuǎn)換:無法用以上方法得到新圖案,。 如果有多種可用的轉(zhuǎn)換方法,請選擇序號最小的那個,。 只使用1--7中的一個步驟來完成這次轉(zhuǎn)換,。 [編輯]格式PROGRAM NAME: transform INPUT FORMAT: file (transform.in) 第一行: 單獨(dú)的一個整數(shù)N。 第二行到第N+1行: N行每行N個字符(不是“@”就是“-”),;這是轉(zhuǎn)換前的正方形,。 第N+2行到第2*N+1行: N行每行N個字符(不是“@”就是“-”);這是轉(zhuǎn)換后的正方形,。 OUTPUT FORMAT: file (transform.out) 單獨(dú)的一行包括1到7之間的一個數(shù)字(在上文已描述)表明需要將轉(zhuǎn)換前的正方形變?yōu)檗D(zhuǎn)換后的正方形的轉(zhuǎn)換方法,。 [編輯]SAMPLE INPUT3 @-@ --- @@- @-@ @-- --@ [編輯]SAMPLE OUTPUT1 /*
ID: liluvu1
LANG: C++
TASK: transform
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define N 10
char before[N][N];
char after[N][N];
typedef struct {
int type;
void (*handle)(char a[N][N], int n);
} trans_s;
enum {
ROT90=1,
ROT180,
ROT270,
MIRROR,
COMP,
NOTCHANGE,
NOWAY,
};
bool isEuqal(char a[N][N], char b[N][N], int n){
for (int i = 0; i < n; i++){
for (int j = 0; j < n; j++){
if (a[i][j] != b[i][j])
return 0;
}
}
return 1;
}
void arrCopy(char a[N][N], char b[N][N], int n){
for (int i = 0; i < n; i++){
for (int j = 0; j < n; j++){
a[i][j] = b[i][j];
}
}
}
void rot90(char a[N][N], int n){
char temp[N][N];
arrCopy(temp, a, n);
for (int i = 0; i < n; i++){
for (int j = 0; j < n; j++){
temp[i][j] = a[n-1-j][i];
}
}
arrCopy(a, temp, n);
}
void rot180(char a[N][N], int n){
char temp[N][N];
arrCopy(temp, a, n);
for (int i = 0; i < n; i++){
for (int j = 0; j < n; j++){
temp[i][j] = a[n-1-i][n-1-j];
}
}
arrCopy(a, temp, n);
}
void rot270(char a[N][N], int n){
char temp[N][N];
arrCopy(temp, a, n);
for (int i = 0; i < n; i++){
for (int j = 0; j < n; j++){
temp[i][j] = a[j][n-1-i];
}
}
arrCopy(a, temp, n);
}
void mirror(char a[N][N], int n){
char temp[N][N];
arrCopy(temp, a, n);
for (int i = 0; i < n; i++){
for (int j = 0; j < n; j++){
temp[i][j] = a[i][n-1-j];
}
}
arrCopy(a, temp, n);
}
void comp(char a[N][N], int n){
mirror(a, n);
}
trans_s list[] = {
{ROT90, rot90},
{ROT180, rot180},
{ROT270, rot270},
{MIRROR, mirror},
{COMP, comp},
{NOTCHANGE, NULL},
{NOWAY, NULL},
};
int main(){
FILE *fin = NULL;
FILE *fout = NULL;
fin = fopen("transform.in", "r");
fout = fopen("transform.out", "w");
int n = 0;
fscanf(fin, "%d\n", &n);
for (int i = 0; i < n; i++){
fgets(before[i], N, fin);
}
for (int i = 0; i < n; i++){
fgets(after[i], N, fin);
}
int fnum = sizeof(list)/sizeof(list[0]);
char temp[N][N];
char temp2[N][N];
int ret = NOWAY;
for (int i = 0; i < fnum; i++){
arrCopy(temp, before, n);
if (list[i].handle) list[i].handle(temp, n);
if (list[i].type == COMP) {
for (int j = 0; j < ROT270; j++) {
arrCopy(temp2, temp, n);
if (list[j].handle) list[j].handle(temp2, n);
if (isEuqal(temp2, after, n)){
ret = COMP;
break;
}
}
} else {
if (isEuqal(temp, after, n)){
ret = list[i].type;
break;
}
}
}
fprintf(fout, "%d\n", ret);
} |
|