天天看点

【USACO1.2_2】★Transformations 方块转换

一块N x N(1<=N<=10)正方形的黑白瓦片的图案要被转换成新的正方形图案。写一个程序来找出将原始图案按照以下列转换方法转换成新图案的最小方式:

1:转90度:图案按顺时针转90度。

2:转180度:图案按顺时针转180度。

3:转270度:图案按顺时针转270度。

4:反射:图案在水平方向翻转(以中央铅垂线为中心形成原图案的镜像)。

5:组合:图案在水平方向翻转,然后再按照1到3之间的一种再次转换。

6:不改变:原图案不改变。

7:无效转换:无法用以上方法得到新图案。

如果有多种可用的转换方法,请选择序号最小的那个。

只使用1--7中的一个步骤来完成这次转换。

[编辑]格式

PROGRAM NAME: transform

INPUT FORMAT:

(file transform.in)

第一行: 单独的一个整数N。

第二行到第N+1行: N行每行N个字符(不是“@”就是“-”);这是转换前的正方形。

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

OUTPUT FORMAT:

(file transform.out)

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

[编辑]SAMPLE INPUT

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

[编辑]SAMPLE OUTPUT

1      
/*
ID: zwcwu52
PROG: transform
LANG: C++
*/

#include <iostream>
#include <fstream>
#include <string>

using namespace std;

char blkSrc[10][10], blkDst[10][10];	//源方阵、目标方阵

int main()
{
    ofstream fout ("transform.out");
    ifstream fin ("transform.in");
   
	unsigned N;		//阶数
	unsigned num = 7;	//方案数字
	
	fin >> N;
	
	//读取源方阵
	for(unsigned i = 0; i < N; i++)
	{	for(unsigned j = 0; j < N; j++)
		{fin >> blkSrc[i][j];}
	}
	
	//读取目标方阵
	for(unsigned i = 0; i < N; i++)
	{	for(unsigned j = 0; j < N; j++)
		{fin >> blkDst[i][j];}
	}
	
	do 
	{
		bool b = true;		//b 标识是否完全符合
		
		//按方案1检测
		for(unsigned i = 0; i < N; i++)
		{	for(unsigned j = 0; j < N; j++)
			{
				if(blkSrc[i][j] != blkDst[j][N - i - 1])
				{
					b = false;
					break;
				}
			}
		}
		if(true == b)
		{
			num = 1;
			break;
		}
		
		
		//按方案2检测
		b = true;
		for(unsigned i = 0; i < N; i++)
		{	for(unsigned j = 0; j < N; j++)
			{
				if(blkSrc[i][j] != blkDst[N- i - 1][N - j - 1])
				{
					b = false;
					break;
				}
			}
		}
		if(true == b)
		{
			num = 2;
			break;
		}
		
		//按方案3检测
		b = true;
		for(unsigned i = 0; i < N; i++)
		{	for(unsigned j = 0; j < N; j++)
			{
				if(blkSrc[i][j] != blkDst[N- j - 1][i])
				{
					b = false;
					break;
				}
			}
		}
		if(true == b)
		{
			num = 3;
			break;
		}
		
		//按方案4检测
		b = true;
		for(unsigned i = 0; i < N; i++)
		{	for(unsigned j = 0; j < N; j++)
			{
				if(blkSrc[i][j] != blkDst[i][N - j - 1])
				{
					b = false;
					break;
				}
			}
		}
		if(true == b)
		{
			num = 4;
			break;
		}
		
		//按方案5检测
		b = true;
		for(unsigned i = 0; i < N; i++)
		{	for(unsigned j = 0; j < N; j++)
			{
				if(blkSrc[i][j] != blkDst[N - j - 1][N - i - 1])
				{
					b = false;
					break;
				}
			}
		}
		if(true == b)
		{
			num = 5;
			break;
		}
		
		//按方案5检测
		b = true;
		for(unsigned i = 0; i < N; i++)
		{	for(unsigned j = 0; j < N; j++)
			{
				if(blkSrc[i][j] != blkDst[N - i - 1][j])
				{
					b = false;
					break;
				}
			}
		}
		if(true == b)
		{
			num = 5;
			break;
		}
		
		//按方案5检测
		b = true;
		for(unsigned i = 0; i < N; i++)
		{	for(unsigned j = 0; j < N; j++)
			{
				if(blkSrc[i][j] != blkDst[j][i])
				{
					b = false;
					break;
				}
			}
		}
		if(true == b)
		{
			num = 5;
			break;
		}
		
		//按方案6检测
		b = true;
		for(unsigned i = 0; i < N; i++)
		{	for(unsigned j = 0; j < N; j++)
			{
				if(blkSrc[i][j] != blkDst[i][j])
				{
					b = false;
					break;
				}
			}
		}
		if(true == b)
		{
			num = 6;
			break;
		}
		
	}while(0);
	
	fout << num << endl;
	
    return 0;
}
           

继续阅读