洛谷P2630 题解

我先讲一下我的思路

  1. 将A,B,C,D四种操作用函数储存起来;

  2. 枚举所有可能出现的情况:A,B,C,D,AA,AB,AC,AD,BB,BC,BD,CC,CD,DD,ABC,ABD,ACD,BCD,ABCD共19种情况;(这里面一定有遗漏的点,但由于数据太水,所以没有一一列出来)

  3. 对初始矩阵进行上面枚举的操作,如果操作后与最终矩阵相同,便直接输出所对应的枚举的操作;

  4. 如果此时还没有结束程序(即所有操作都枚举完之后,皆不符合最终矩阵),就直接输出“Poland cannot into space!!!”


这是我的局部程序

1.A的操作函数:

int A_operation()
{
	memset(c,0,sizeof(c));//由于要多次用这个转换数组,所以必须清零 
	for(int i=1;i<=3;i++)
	{
		for(int j=1;j<=3;j++)
		{
			c[i][j]=a[3-j+1][i];//按照题目要求进行操作 
		}
	}
	memcpy(a,c,sizeof(a));//将c这个中间 数组里的值拷贝到a数组中 
}

可以看到这里我用了memset和memcpy这两个函数:

memset 是内存赋值函数,比用for来赋值快很多,只是只能赋值常量;

用法:memset(数组名,常量,sizeof(数组名))

memcpy 是内存赋值函数,将一个数组里的值复制到另一个数组中

用法:memcpy(目标数组名,被复制函数名,sizeof(被复制函数名))


2.枚举的操作情况:

memcpy(a,b,sizeof(a));//因为a的值会多次改变,所以b是输入的初始数组,要在每一次枚举的操作后,将a覆盖 
flag=1;//标志,判断是否成功 
A_operation();
A_operation();//进行操作 
for(int i=1;i<=3;i++)
{
	for(int j=1;j<=3;j++)
	{
		if(a[i][j]!=d[i][j])//假如有一个不相同,就跳出循环 
		{
			flag=0;//失败 
			goto p;//跳出循环 
		}
	}
}
p:
if(flag==1)//假如没有失败 
{
	printf("AA");//输出操作 
	return 0; //结束程序 
}

这里有一个新的跳出循环的方法,goto语句(我也是才学的

这个语句与break,continue,return等语句的区别是:

break是跳出一层循环,continue是跳过本次循环,return是结束程序||函数,而goto则是想怎么跳就怎么跳(是不是有点心动了~~~)

用法:goto 语句名

语句名:(要跳到的地方)


直接上程序

#include<bits/stdc++.h>
using namespace std;
int a[4][4],b[4][4],c[4][4],d[4][4];
int flag=1;    
int A_operation()
{
	memset(c,0,sizeof(c));
	for(int i=1;i<=3;i++)
	{
		for(int j=1;j<=3;j++)
		{
			c[i][j]=a[3-j+1][i];
		}
	}
	memcpy(a,c,sizeof(a)); 
}
int B_operation()
{
	memset(c,0,sizeof(c));
	for(int i=1;i<=3;i++)
	{
		for(int j=1;j<=3;j++)
		{
			c[i][j]=a[j][3-i+1];
		}
	}
	memcpy(a,c,sizeof(a));
}

int C_operation()
{
	memset(c,0,sizeof(c));
	for(int i=1;i<=3;i++)
	{
		for(int j=1;j<=3;j++)
		{
			c[i][j]=a[i][3-j+1];
		}
	}
	memcpy(a,c,sizeof(a));
}
int D_operation()
{
	memset(c,0,sizeof(c));
	for(int i=1;i<=3;i++)
	{
		for(int j=1;j<=3;j++)
		{
			c[i][j]=a[3-i+1][j];
		}
	}
	memcpy(a,c,sizeof(a));
}
int main()
{
	for(int i=1;i<=3;i++)
	{
		for(int j=1;j<=3;j++)
		{
			scanf("%d",&b[i][j]);
		}
	}
	for(int i=1;i<=3;i++)
	{
		for(int j=1;j<=3;j++)
		{
			scanf("%d",&d[i][j]);
		}
	}
	memcpy(a,b,sizeof(a));
	flag=1;
	A_operation();
	for(int i=1;i<=3;i++)
	{
		for(int j=1;j<=3;j++)
		{
			if(a[i][j]!=d[i][j])
			{
				flag=0;
				goto a;
			}
		}
	}
	a:
	if(flag==1)
	{
		printf("A");
		return 0;
	}
	memcpy(a,b,sizeof(a));
	flag=1;
	B_operation();
	for(int i=1;i<=3;i++)
	{
		for(int j=1;j<=3;j++)
		{
			if(a[i][j]!=d[i][j])
			{
				flag=0;
				goto b;
			}
		}
	}
	b:
	if(flag==1)
	{
		printf("B");
		return 0;
	}
	memcpy(a,b,sizeof(a));
	flag=1;
	C_operation();
	for(int i=1;i<=3;i++)
	{
		for(int j=1;j<=3;j++)
		{
			if(a[i][j]!=d[i][j])
			{
				flag=0;
				goto c;
			}
		}
	}
	c:
	if(flag==1)
	{
		printf("C");
		return 0;
	}
	memcpy(a,b,sizeof(a));
	flag=1;
	D_operation();
	for(int i=1;i<=3;i++)
	{
		for(int j=1;j<=3;j++)
		{
			if(a[i][j]!=d[i][j])
			{
				flag=0;
				goto d;
			}
		}
	}
	d:
	if(flag==1)
	{
		printf("D");
		return 0;
	}
	memcpy(a,b,sizeof(a));
	flag=1;
	A_operation();
	A_operation();
	for(int i=1;i<=3;i++)
	{
		for(int j=1;j<=3;j++)
		{
			if(a[i][j]!=d[i][j])
			{
				flag=0;
				goto p;
			}
		}
	}
	p:
	if(flag==1)
	{
		printf("AA");
		return 0;
	}
	memcpy(a,b,sizeof(a));
	flag=1;
	A_operation();
	B_operation();
	for(int i=1;i<=3;i++)
	{
		for(int j=1;j<=3;j++)
		{
			if(a[i][j]!=d[i][j])
			{
				flag=0;
				goto e;
			}
		}
	}
	e:
	if(flag==1)
	{
		printf("AB");
		return 0;
	}
	memcpy(a,b,sizeof(a));
	flag=1;
	A_operation();
	C_operation();
	for(int i=1;i<=3;i++)
	{
		for(int j=1;j<=3;j++)
		{
			if(a[i][j]!=d[i][j])
			{
				flag=0;
				goto f;
			}
		}
	}
	f:
	if(flag==1)
	{
		printf("AC");
		return 0;
	}
	memcpy(a,b,sizeof(a));
	flag=1;
	A_operation();
	D_operation();
	for(int i=1;i<=3;i++)
	{
		for(int j=1;j<=3;j++)
		{
			if(a[i][j]!=d[i][j])
			{
				flag=0;
				goto g;
			}
		}
	}
	g:
	if(flag==1)
	{
		printf("AD");
		return 0;
	}
	memcpy(a,b,sizeof(a));
	flag=1;
	B_operation();
	B_operation();
	for(int i=1;i<=3;i++)
	{
		for(int j=1;j<=3;j++)
		{
			if(a[i][j]!=d[i][j])
			{
				flag=0;
				goto q;
			}
		}
	}
	q:
	if(flag==1)
	{
		printf("BB");
		return 0;
	}
	memcpy(a,b,sizeof(a));
	flag=1;
	B_operation();
	D_operation();			
	for(int i=1;i<=3;i++)
	{
		for(int j=1;j<=3;j++)
		{
			if(a[i][j]!=d[i][j])
			{
				flag=0;
				goto h;
			}
		}
	}
	h:
	if(flag==1)
	{
		printf("BD");
		return 0;
	}
	memcpy(a,b,sizeof(a));
	flag=1;
	C_operation();
	B_operation();
	for(int i=1;i<=3;i++)
	{
		for(int j=1;j<=3;j++)
		{
			if(a[i][j]!=d[i][j])
			{
				flag=0;
				goto i;
			}
		}
	}
	i:
	if(flag==1)
	{
		printf("BC");
		return 0;
	}
	memcpy(a,b,sizeof(a));
	flag=1;
	C_operation();
	C_operation();
	for(int i=1;i<=3;i++)
	{
		for(int j=1;j<=3;j++)
		{
			if(a[i][j]!=d[i][j])
			{
				flag=0;
				goto r;
			}
		}
	}
	r:
	if(flag==1)
	{
		printf("CC");
		return 0;
	}
	memcpy(a,b,sizeof(a));
	flag=1;
	C_operation();
	D_operation();
	for(int i=1;i<=3;i++)
	{
		for(int j=1;j<=3;j++)
		{
			if(a[i][j]!=d[i][j])
			{
				flag=0;
				goto j;
			}
		}
	}
	j:
	if(flag==1)
	{
		printf("CD");
		return 0;
	}
	memcpy(a,b,sizeof(a));
	flag=1;
	D_operation();
	D_operation();
	for(int i=1;i<=3;i++)
	{
		for(int j=1;j<=3;j++)
		{
			if(a[i][j]!=d[i][j])
			{
				flag=0;
				goto s;
			}
		}
	}
	s:
	if(flag==1)
	{
		printf("DD");
		return 0;
	}
	memcpy(a,b,sizeof(a));
	flag=1;
	A_operation();
	B_operation();
	C_operation();
	for(int i=1;i<=3;i++)
	{
		for(int j=1;j<=3;j++)
		{
			if(a[i][j]!=d[i][j])
			{
				flag=0;
				goto k;
			}
		}
	}
	k:
	if(flag==1)
	{
		printf("ABC");
		return 0;
	}
	memcpy(a,b,sizeof(a));
	flag=1;
	A_operation();
	D_operation();
	C_operation();
	for(int i=1;i<=3;i++)
	{
		for(int j=1;j<=3;j++)
		{
			if(a[i][j]!=d[i][j])
			{
				flag=0;
				goto l;
			}
		}
	}
	l:
	if(flag==1)
	{
		printf("ACD");
		return 0;
	}
	memcpy(a,b,sizeof(a));
	flag=1;
	A_operation();
	B_operation();
	D_operation();
	for(int i=1;i<=3;i++)
	{
		for(int j=1;j<=3;j++)
		{
			if(a[i][j]!=d[i][j])
			{
				flag=0;
				goto m;
			}
		}
	}
	m:
	if(flag==1)
	{
		printf("ABD");
		return 0;
	}
	memcpy(a,b,sizeof(a));
	flag=1;
	D_operation();
	B_operation();
	C_operation();
	for(int i=1;i<=3;i++)
	{
		for(int j=1;j<=3;j++)
		{
			if(a[i][j]!=d[i][j])
			{
				flag=0;
				goto n;
			}
		}
	}
	n:
	if(flag==1)
	{
		printf("BCD");
		return 0;
	}
	memcpy(a,b,sizeof(a));
	flag=1;
	A_operation();
	D_operation();
	B_operation();
	C_operation();
	for(int i=1;i<=3;i++)
	{
		for(int j=1;j<=3;j++)
		{
			if(a[i][j]!=d[i][j])
			{
				flag=0;
				goto o;
			}
		}
	}
	o:
	if(flag==1)
	{
		printf("ABCD");
		return 0;
	}
	printf("Poland cannot into space!!!");//假如上面枚举的情况都不行,就输出(对应4)
	return QWQ
}
原文地址:https://www.cnblogs.com/nth-element/p/10604318.html