P1205 [USACO1.2] 方块转换 Transformations c++思路+实现

题目描述

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

  • 转 90°:图案按顺时针转 90°。

  • 转 180°:图案按顺时针转 180°。

  • 转 270°:图案按顺时针转 270°。

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

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

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

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

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

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

输入格式

第一行一个正整数 n。

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

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

输出格式

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

输入输出样例

输入 #1复制

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

输出 #1复制

1

说明/提示

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

题目翻译来自 NOCOW。

USACO Training Section 1.2

 思路

按题意,1~7种操作分别为:

1:

c[i][j]=a[n-1-i][n-1-j];	

2:

c[i][j]=a[n-1-j][i];

3:

c[i][j]=a[j][n-1-i];

 4:

c[i][j]=a[i][n-1-j];

5:

          (1)

d[i][j]=a[i][n-1-j];

           (2)

d[i][j]=a[i][n-1-j];

             (3)

d[i][j]=a[i][n-1-j];

6:

c[i][j]=a[i][j];	

如果以上操作都不行,输出7。

同时,还需要一个判断函数。

 ——————————————————————————————————————————

C++代码实现

#include <bits/stdc++.h>//万能头文件
using namespace std;//使用标准命名空间
int n;
char a[10][10],b[10][10],c[10][10],d[10][10];
//一大堆函数
bool ifr()//判断是否构成新方块
{
	for(int i=0;i<n;i++)
		for(int j=0;j<n;j++)
			if(c[i][j]!=b[i][j])//单一元素不同,直接返伪
				return false;
	return true;//否则是真	
}
void ts_90()//顺时针90°(1) 
{
	for(int i=0;i<n;i++)
		for(int j=0;j<n;j++)
			c[i][j]=a[n-1-j][i];	
}

void ts_180()//顺时针180° (2)
{
	for(int i=0;i<n;i++)
		for(int j=0;j<n;j++)
			c[i][j]=a[n-1-i][n-1-j];	
}

void tn_90()//逆时针90° (3)
{
	for(int i=0;i<n;i++)
		for(int j=0;j<n;j++)
			c[i][j]=a[j][n-1-i];	
}

void ref()//反射 (4)
{
	for(int i=0;i<n;i++)
		for(int j=0;j<n;j++)
			c[i][j]=a[i][n-1-j];	
}

void mode_1()//组合1 (5)
{
	for(int i=0;i<n;i++)
		for(int j=0;j<n;j++)
			d[i][j]=a[i][n-1-j];

	for(int i=0;i<n;i++)
		for(int j=0;j<n;j++)
			c[i][j]=d[n-1-j][i];		
}

void mode_2()//组合2 (5)
{
	for(int i=0;i<n;i++)
		for(int j=0;j<n;j++)
			d[i][j]=a[i][n-1-j];

	for(int i=0;i<n;i++)
		for(int j=0;j<n;j++)
			c[i][j]=d[n-1-i][n-1-j];	
}

void mode_3()//组合3 (5)
{
	for(int i=0;i<n;i++)
		for(int j=0;j<n;j++)
			d[i][j]=a[i][n-1-j];
	
	for(int i=0;i<n;i++)
		for(int j=0;j<n;j++)
			c[i][j]=d[j][n-1-i];		
}

void norm()//不改变 (6)
{
	for(int i=0;i<n;i++)
		for(int j=0;j<n;j++)
			c[i][j]=a[i][j];	
}
//否则是7
int main()
{
    //输入
	cin>>n;
	for(int i=0;i<n;i++)
		for(int j=0;j<n;j++)
			cin>>a[i][j];
	for(int i=0;i<n;i++)
		for(int j=0;j<n;j++)
			cin>>b[i][j];
    //按题意进行操作,输出1~6
	ts_90();
	if(ifr())
	{
		cout<<"1";
		return 0; 
	}
	ts_180();
	if(ifr())
	{
		cout<<"2";
		return 0; 
	}
	tn_90();
	if(ifr())
	{
		cout<<"3";
		return 0; 
	}
	ref();
	if(ifr())
	{
		cout<<"4";
		return 0; 
	}
	
	mode_1();
	if(ifr())
	{
		cout<<"5";
		return 0; 
	}
	mode_2();
	if(ifr())
	{
		cout<<"5";
		return 0; 
	}
	mode_3();
	if(ifr())
	{
		cout<<"5";
		return 0; 
	}
	norm();
	if(pd())
	{
		cout<<"6";
		return 0; 
	}
	cout<<"7";
	return 0;
}

制作不易,点个赞再走吧!

END

  • 10
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值