#35-【刷题】乐乐的方块

200 篇文章 7 订阅
31 篇文章 0 订阅

Description

乐乐被小学数学课本中“空间与图形”的内容迷住了,她整天在琢磨着图形的各种变换:对称、旋转、翻转等等。这天,乐乐用“@”和“-”两种字符拼成了一块N x N(1≦N≦20)的方形图案A,现在她想将其转换成新的方形图案B。有以下几种转换方法:

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

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

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

方法4:反射:图案在水平方向翻转。

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

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

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

只能选择上述7种方法中的某一种来转换图案。例如有如下一个3*3的图案A:

 

@-@

---

@-@

要转换成图案B:

@-@

---

@-@

按照上述的方法,有方法2、方法4和方法6共三种方法可以实现这种转换。你只需要输出:2,表示采用序号最小的方法。

你能帮助乐乐写一个程序,来解决这个难题吗?

Input

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

 

Output

单独的一行包括1到7之间的一个数字,表明需要将转换前的方块变为转换后的方块的转换方法(序号最小者)。

Sample Input

输入样例1:3@-@---@@-@-@@----@输入样例2:4----@@@@--@@------@----@-@@--@@-

Sample Output

输出样例1:1输出样例2:7

 

#include <iostream>

#define SIZE 1500

using namespace std;

bool a[SIZE][SIZE], b[SIZE][SIZE], t[SIZE][SIZE], t2[SIZE][SIZE], t3[SIZE][SIZE];
int n;

bool comp(bool a[SIZE][SIZE], bool b[SIZE][SIZE]) // 判等
{
	int i, j;
	
	for (i = 1; i <= n; i++)
	{
		for (j = 1; j <= n; j++)
		{
			if (a[i][j] != b[i][j])
			{
				return false;
			}
		}
	}
	
	return true;
}

/*
123
456
789

741
852
963
*/

bool function1(bool a[SIZE][SIZE]) // 第一种方法
{
	int i, j;
	
	for (i = 1; i <= n; i++)
	{
		for (j = 1; j <= n; j++)
		{
			t[i][j] = a[n-j+1][i];
		}
	}
	
	return comp(t, b);
}

/*
123
456
789

987
654
321
*/
bool function2(bool a[SIZE][SIZE]) // 第二种方法
{
	int i, j;
	
	for (i = 1; i <= n; i++)
	{
		for (j = 1; j <= n; j++)
		{
			t[i][j] = a[n-i+1][n-j+1];
		}
	}
	
	return comp(t, b);
}

/*
123
456
789

369
258
147
*/
bool function3(bool a[SIZE][SIZE]) // 第三种方法
{
	int i, j;
	
	for (i = 1; i <= n; i++)
	{
		for (j = 1; j <= n; j++)
		{
			t[i][j] = a[j][n-i+1];
		}
	}
	
	return comp(t, b);
}

/*
123
456
789

321
654
987
*/
bool function4(bool a[SIZE][SIZE])
{
	int i, j;
	
	for (i = 1; i <= n; i++)
	{
		for (j = 1; j <= n; j++)
		{
			t[i][j] = a[i][n-j+1];
		}
	}
	
	return comp(t, b);
}

bool function5(bool a[SIZE][SIZE])
{
	int i, j;
	
	for (i = 1; i <= n; i++)
	{
		for (j = 1; j <= n; j++)
		{
			t2[i][j] = a[i][n-j+1];
		}
	}
	
	for (i = 1; i <= n; i++)
	{
		for (j = 1; j <= n; j++)
		{
			t3[i][j] = t2[i][j];
		}
	}
	if (function1(t3))
	{
		return true;
	}
	for (i = 1; i <= n; i++)
	{
		for (j = 1; j <= n; j++)
		{
			t3[i][j] = t2[i][j];
		}
	}
	if (function2(t3))
	{
		return true;
	}
	for (i = 1; i <= n; i++)
	{
		for (j = 1; j <= n; j++)
		{
			t[i][j] = t2[i][j];
		}
	}
	if (function3(t3))
	{
		return true;
	}
	
	return false;
}

int main(int argc, char** argv)
{
	int i, j;
	char c;
	
	cin >> n;
	for (i = 1; i <= n; i++)
	{
		for (j = 1; j <= n; j++)
		{
			cin >> c;
			if (c == '@')
			{
				a[i][j] = true; // 字符存在bool数组内
			}
		}
	}
	for (i = 1; i <= n; i++)
	{
		for (j = 1; j <= n; j++)
		{
			cin >> c;
			if (c == '@')
			{
				b[i][j] = true;
			}
		}
	}
	
	if (function1(a))
	{
		cout << 1 << endl;
		return 0;
	}
	if (function2(a))
	{
		cout << 2 << endl;
		return 0;
	}
	if (function3(a))
	{
		cout << 3 << endl;
		return 0;
	}
	if (function4(a))
	{
		cout << 4 << endl;
		return 0;
	}
	if (function5(a))
	{
		cout << 5 << endl;
		return 0;
	}
	if (comp(a, b))
	{
		cout << 6 << endl;
		return 0;
	}
	
	cout << 7 << endl;
	
	return 0;
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值