P1205 [USACO1.2]方块转换

P1205 [USACO1.2]方块转换 Transformations

题目描述

一块 n×nn \times nn×n 正方形的黑白瓦片的图案要被转换成新的正方形图案。写一个程序来找出将原始图案按照以下列转换方法转换成新图案的最小方式:

  • 转 90°90\degree90°:图案按顺时针转 90°90\degree90°。
  • 转 180°180\degree180°:图案按顺时针转 180°180\degree180°。
  • 转 270°270\degree270°:图案按顺时针转 270°270\degree270°。
  • 反射:图案在水平方向翻转(以中央铅垂线为中心形成原图案的镜像)。
  • 组合:图案在水平方向翻转,然后再按照 1∼31 \sim 31∼3 之间的一种再次转换。
  • 不改变:原图案不改变。
  • 无效转换:无法用以上方法得到新图案。

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

只使用上述 777 个中的一个步骤来完成这次转换。

输入格式

第一行一个正整数 nnn。

然后 nnn 行,每行 nnn 个字符,全部为 @-,表示初始的正方形。

接下来 nnn 行,每行 nnn 个字符,全部为 @-,表示最终的正方形。

输出格式

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

输入输出样例

输入 #1

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

输出 #1

1

说明/提示

【数据范围】
对于 100%100%100% 的数据,1≤n≤101\le n \le 101≤n≤10。

题目翻译来自NOCOW。

USACO Training Section 1.2

#include <iostream>
using namespace std;
char a[11][11],b[11][11],w1[11][11],w2[11][11],w3[11][11],w4[11][11],w5[11][11],w6[11][11],w7[11][11];
int n;
int main()
{
	bool flag1=true,flag2=true,flag3=true,flag4=true,flag5=true,flag6=true,flag7=true,flag8=true;
	cin>>n;
	for(int i=1;i<=n;++i)
	{
		for(int j=1;j<=n;++j)
		{
			cin>>a[i][j];
			w1[j][n-i+1]=a[i][j];//顺时针90度
			w2[n-i+1][n-j+1] =a[i][j];//顺时针180度
			w3[n-j+1][i]=a[i][j];//顺时针270度
			w4[i][n-j+1]=a[i][j];//反射
		}
	}
	for(int i=1;i<=n;++i)
	{
		for(int j=1;j<=n;++j)
		{
			cin>>b[i][j];
		}
	}
	for(int i=1;i<=n;++i)
	{
		for(int j=1;j<=n;++j)
		{
			w5[j][n-i+1]=w4[i][j];
			w6[n-i+1][n-j+1]=w4[i][j];
			w7[n-j+1][i]=w4[i][j];
		}
	}
	for(int i=1;i<=n;++i) 
	{
		for(int j=1;j<=n;++j)
		{
			if(w1[i][j]!=b[i][j])flag1=false;
			if(w2[i][j]!=b[i][j])flag2=false;
			if(w3[i][j]!=b[i][j])flag3=false;
			if(w4[i][j]!=b[i][j])flag4=false;
			if(w5[i][j]!=b[i][j])flag5=false;
			if(w6[i][j]!=b[i][j])flag6=false;
			if(w7[i][j]!=b[i][j])flag7=false;
			if(a[i][j]!=b[i][j])flag8=false;
		}
	}
	if(flag1)
	{
		cout<<1;
		return 0;
	}
	if(flag2)
	{
		cout<<2;
		return 0;
	}
	if(flag3)
	{
		cout<<3;
		return 0;
	}
	if(flag4)
	{
		cout<<4;
		return 0;
	}
	if(flag5)
	{
		cout<<5;
		return 0;
	}
	if(flag6)
	{
		cout<<5;
		return 0;
	}
	if(flag7)
	{
		cout<<5;
		return 0;
	}
	if(flag8)
	{
		cout<<6;
		return 0;
	}
	else cout<<7;
	return 0;
 } 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值