初学者能懂的讲解
查看原帖
初学者能懂的讲解
1025171
elainya_stars楼主2024/4/30 16:46

暴力代码详解

#include<bits/stdc++.h>
using namespace std;

int n;
bool a[11][11];//原题的a 
bool aa[11][11];//用来记录a,因为之后a会变 
bool b[11][11];//原题的b 
bool c[11][11];//用来翻转或反射

void turn90()//翻转90度操作 
{
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
		  c[j][n-i+1]=a[i][j];//c变为翻转90度的a 
		  
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
		  a[i][j]=c[i][j];//a替代c 
		  
	return ;
}

void flip()//反射操作 
{
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
		  c[i][n-j+1]=a[i][j];//c变为反射后的a 
		  
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
		  a[i][j]=c[i][j];//a替代c 
		  
	return ;
}

bool isTurn90()//是否翻转90度能重合 
{
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
		  a[i][j]=aa[i][j];//把a变为原始状态 
		  
	turn90();//翻转90度 
	
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			if(b[i][j]!=a[i][j])
			  return false;//比较 
	return true;
}

bool isTurn180()//是否翻转180度能重合
{
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
		  a[i][j]=aa[i][j];//把a变为原始状态 
		  
	turn90();
	turn90();//翻转180度 
	
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			if(b[i][j]!=a[i][j])
			  return false;//比较 
	return true;
}
 
bool isTurn270()//是否翻转270度能重合
{
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
		  a[i][j]=aa[i][j];//把a变为原始状态 
		  
	turn90();
	turn90();
	turn90();//翻转270度
	
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			if(b[i][j]!=a[i][j])
			  return false;//比较 
	return true;
}

bool isFlip()//是否反射后能重合
{
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
		  a[i][j]=aa[i][j];//把a变为原始状态 
		  
	flip();//反射 
	
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			if(b[i][j]!=a[i][j])
			  return false;//比较 
	return true;
}

bool isMultiple90()//组合1 
{
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
		  a[i][j]=aa[i][j];//把a变为原始状态 
		  
	flip();
	turn90();//反射+90度 
	
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			if(b[i][j]!=a[i][j])
			  return false;//比较 
	return true;
}

bool isMultiple180()//组合2 
{
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
		  a[i][j]=aa[i][j];//把a变为原始状态 
		  
	flip();
	turn90();
	turn90();//反射+180度 
	
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			if(b[i][j]!=a[i][j])
			  return false;//比较 
	return true;
}

bool isMultiple270()//组合3 
{
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
		  a[i][j]=aa[i][j];//把a变为原始状态
		   
	flip();
	turn90();
	turn90();
	turn90();//反射+270度 
	
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			if(b[i][j]!=a[i][j])
			  return false;//比较 
	return true;
}

bool isMultiple()
{
	if(isMultiple90() || isMultiple180() || isMultiple270())
	  return true;//三种组合之一成立 
	return false;
}

bool noTurn()//不改变 
{
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
		  a[i][j]=aa[i][j];//把a变为原始状态 
		  
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			if(b[i][j]!=a[i][j])
			  return false;//比较 
	return true;
}

int main()
{
	scanf("%d",&n);
	
	for(int i=1;i<=n;i++)//把字符串转换为01数字 
	{
		string s;
		cin>>s;
		for(int j=1;j<=n;j++)
		{
			if(s[j-1]=='@')
			  a[i][j]=1;
			else
			  a[i][j]=0;
		}
	}
	
	for(int i=1;i<=n;i++)//把字符串转换为01数字 
	{
		string s;
		cin>>s;
		for(int j=1;j<=n;j++)
		{
			if(s[j-1]=='@')
			  b[i][j]=1;
			else
			  b[i][j]=0;
		}
	}
	
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
		  aa[i][j]=a[i][j];//记录a,因为之后a会变 
		  
	if(isTurn90())
	  printf("1");
	else if(isTurn180())
	  printf("2");
	else if(isTurn270())
	  printf("3");
	else if(isFlip())
	  printf("4");
	else if(isMultiple())
	  printf("5");
	else if(noTurn())
	  printf("6");
	else
	  printf("7");
	return 0;
}
2024/4/30 16:46
加载中...