[USACO1.2]方块转换 Transformations

版权声明:转载无所谓的。。。 https://blog.csdn.net/xuxiayang/article/details/82951206

大意

给定一些转换规则,求使用哪个规则能刚好转换(若有多种方案,输出数字较小的那个)


思路

这题目一开始描述得贼像魔板,差点就打了bfs
其实就是模拟了啦


代码

#include<cstdio>
#include<cstring>
#define r(i,a,b) for(register int i=a;i<=b;i++)
using namespace std;char c[11][11],mb[11][11],tmp[11][11];int n;
inline bool change1(){r(i,1,n)r(j,1,n)if(mb[j][n-i+1]!=c[i][j]) return false;return true;}
inline bool change2(){r(i,1,n)r(j,1,n)if(mb[n-i+1][n-j+1]!=c[i][j]) return false;return true;}
inline bool change3(){r(i,1,n)r(j,1,n)if(mb[n-j+1][i]!=c[i][j]) return false;return true;}
inline bool change4(){r(i,1,n)r(j,1,n)if(mb[i][n-j+1]!=c[i][j]) return false;return true;}
inline bool change5(){r(i,1,n)r(j,1,n)c[i][j]=tmp[i][n-j+1];return change1()||change2()||change3();}
inline bool change6(){r(i,1,n)r(j,1,n)if(mb[i][j]!=c[i][j]) return false;return true;}
signed main()
{
	scanf("%d\n",&n);
	r(i,1,n) gets(c[i]+1);
	r(i,1,n) gets(mb[i]+1);
	if(change1()) return puts("1")&0;
	if(change2()) return puts("2")&0;
	if(change3()) return puts("3")&0;
	if(change4()) return puts("4")&0;
	memcpy(tmp,c,sizeof(tmp));//要用转换后的去判断
	if(change5()) return puts("5")&0;
	memcpy(c,tmp,sizeof(c));//记得还原
	if(change6()) return puts("6")&0;
	puts("7");
}

猜你喜欢

转载自blog.csdn.net/xuxiayang/article/details/82951206
今日推荐