2512 - 方块转换

通过次数

0

提交次数

0

时间限制 : 1 秒 内存限制 : 128 MB

一块N x N1<=N<=10)正方形的黑白瓦片的图案要被转换成新的正方形图案。写一个程序来找出将原始

图案按照以下列转换方法转换成新图案的最小方式:
#1:转90度:图案按顺时针转90度。
#2:转180度:图案按顺时针转180度。
#3:转270度:图案按顺时针转270度。
#4:反射:图案在水平方向翻转(形成原图案的镜像)。
#5:组合:图案在水平方向翻转,然后按照#1-#3之一转换。
#6:不改变:原图案不改变。
#7:无效转换:无法用以上方法得到新图案。
如果有多种可用的转换方法,请选择序号最小的那个。

题目输入

第一行: 单独的一个整数N
第二行到第N+1行: N行每行N个字符(不是“@”就是“-”);这是转换前的正方形。
N+2行到第2*N+1行: N行每行N个字符(不是“@”就是“-”);这是转换后的正方形。

题目输出

单独的一行包括1到7之间的一个数字(在上文已描述)表明需要将转换前的正方形变为转换后的正方形的

转换方法。

输入/输出样例

输入格式

3
@-@
---
@@-
@-@
@--
--@

输出格式

1

C语言解答

#include<stdio.h>
int t,n,a[11][11],b[11][11],c[11][11],i,j,d[11][11];
void a1()
{
	int k,l;
	for(k=0,i=0;k<n;k++,i++)
		for(l=n-1,j=0;l>=0;l--,j++)
			c[i][j]=d[l][k];
}
void a2()
{
	int k,l;
	for(k=n-1,i=0;k>=0;k--,i++)
		for(l=n-1,j=0;l>=0;l--,j++)
			c[i][j]=d[k][l];
}
void a3()
{
	int k,l;
	for(k=n-1,i=0;k>=0;k--,i++)
		for(l=0,j=0;l<n;l++,j++)
			c[i][j]=d[l][k];
}
void a4()
{
	int k,l;
	for(k=0,i=0;k<n;k++,i++)
		for(l=n-1,j=0;l>=0;l--,j++)
			d[i][j]=a[k][l];
}
void a5()
{
	for(i=0;i<n;i++)
		for(j=0;j<n;j++)
			d[i][j]=a[i][j];
}
void a6()
{
	for(i=0;i<n;i++)
		for(j=0;j<n;j++)
			c[i][j]=d[i][j];
}
int bj()
{
	for(i=0;i<n;i++)
		for(j=0;j<n;j++)
			if(b[i][j]!=c[i][j])return(0);
	return(1);
}
void main()
{
	char ch;
	while(scanf("%d\t",&n)!=EOF){
	for(i=0;i<n;i++)
	{
		for(j=0;j<n;j++)
		{
			ch=getchar();
			if(ch=='@')a[i][j]=2;else a[i][j]=1;
		}
		getchar();
	}
	for(i=0;i<n;i++)
	{
		for(j=0;j<n;j++)
		{
			ch=getchar();
			if(ch=='@')b[i][j]=2;else b[i][j]=1;
		}
		getchar();
	}
	a5();a1();
	if(bj())printf("1\n");
	else {a2();if(bj())printf("2\n");
	else {a3();if(bj())printf("3\n");
	else {a4();a6();if(bj())printf("4\n");
	else {a4();a1();if(bj())printf("5\n");
	else {a4();a2();if(bj())printf("5\n");
	else {a4();a3();if(bj())printf("5\n");
	else {a5();a6();if(bj())printf("6\n");
	else printf("7\n");}}}}}}}}
}

C++解答

#include <bits/stdc++.h>
using namespace std;
#define maxn 12
int n;
char aas[4][maxn][maxn];
int check(int from,int to)
{
    for (int i=0;i<n;i++){
        for (int s=0;s<n;s++){
            if (aas[to][i][s]!=aas[from][i][s]) return 0;
        }
    }
    return 1;
}
void xuan(int from,int to)
{
    for (int i=0;i<n;i++){
        for (int s=0;s<n;s++){
            aas[to][s][n-1-i] =aas[from][i][s];
        }
    }
}
void yidong(int from,int to)
{
    for (int i=0;i<n;i++){
        for (int s=0;s<n;s++){
            aas[to][i][s] = aas[from][i][n-1-s];
        }
    }
}
int f(int ans)
{
    if (ans==1){
        xuan(0,2);
        if (check(1,2)) return 1;
    }
    if (ans==2){
        xuan(0,2);
        xuan(2,3);
        if (check(1,3)) return 1;
    }
    if (ans==3){
        xuan(0,2);
        xuan(2,3);
        xuan(3,2);
        if (check(1,2)) return 1;
    }
    if (ans==4){
        yidong(0,2);
        if (check(2,1)) return 1;
    }
    if (ans==5){
        yidong(0,2);
        {
            xuan(2,3);
            if (check(1,3)) return 1;
            xuan(3,2);
            if (check(1,2)) return 1;
            xuan(2,3);
            if (check(1,3)) return 1;
        }
    }
    if (ans==6){
        if (check(0,1)) return 1;
    }
    if (ans==7){
        return 1;
    }
}
int main()
{
    while(scanf("%d",&n)!=EOF){
        for (int i=0;i<n;i++){
            scanf("%s",aas[0][i]);
        }
        for (int i=0;i<n;i++){
            scanf("%s",aas[1][i]);
        }
        for (int i=1;i<=7;i++){
            if (f(i)) {
                printf("%d\n",i);
                break;
            }
        }
    }
    return 0;
}