专栏文章

题解:P1205 [USACO1.2] 方块转换 Transformations

P1205题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@mip4s8at
此快照首次捕获于
2025/12/03 06:09
3 个月前
此快照最后确认于
2025/12/03 06:09
3 个月前
查看原文
模拟……搜索……

1.题意简述:

核心转换方式

90°:图案按顺时针转 90°。
180°:图案按顺时针转 180°。
270°:图案按顺时针转 270°。

其它转换方式

反射:图案在水平方向翻转(以中央铅垂线为中心形成原图案的镜像)。
组合:图案在水平方向翻转,然后再按照 1∼3 之间的一种再次转换。

注:剩下两种为并无实际作用的干扰项,不影响模拟。

2.思路:

本题的核心思路就是对每种操作进行暴力模拟,不过也非完全暴力,我们可以将每种操作写成函数,然后在主函数中按序号递增的顺序进行枚举,依次判断是否能转换成新图案,这样代码就很容易写了。

3.注意事项:

(1)请注意函数的顺序,不要在函数中使用未定义内容。
(2)请注意模拟时 +1+11-1边界问题
(3)注意依次判断时的顺序。

4.代码:

CPP
#include<bits/stdc++.h>
using namespace std;
int n;
char g[15][15],t1[15][15],t2[15][15],f[15][15];
void init(){                     //输入函数。
	cin>>n;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			cin>>g[i][j];
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			cin>>f[i][j]; 
}
void reset(){
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			t1[i][j]=g[i][j];
}
void t90(){
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			t2[j][n-i+1]=t1[i][j];
}
void tfs(){
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			t2[i][n-j+1]=t1[i][j];
}
void strcpy(){
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			t1[i][j]=t2[i][j]; 
}
bool cmp(char a[15][15],char b[15][15]){   //判断是否能转换成新图案。
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			if(a[i][j]!=b[i][j])
				return 0;
	return 1;
}
int main(){
	init();
	reset();
	for(int i=1;i<=3;i++){
		t90();
		if(cmp(t2,f)){
			cout<<i;
			return 0;
		}
		strcpy();
	}
	reset();
	tfs();
	if(cmp(t2,f)){
		cout<<4;
		return 0;
	}
	strcpy();
	for(int i=1;i<=3;i++){
		t90();
		if(cmp(t2,f)){
			cout<<5;
			return 0;
		}
		strcpy();
	}
	if(cmp(g,f)){
		cout<<6;
		return 0;
	}
	cout<<7;
	return 0;
}
qaq......

评论

0 条评论,欢迎与作者交流。

正在加载评论...