#1094 : Lost in the City 找到几个当年c语言留下的坑

思路很简单

对于Hi对象的3x3格子,我们需要存储9个位置。我们将九宫格中的中心2x2位置的单独拿出来做判断,若2x2位置的符合,再去匹配其他8个位置。

由于Hi对象可以旋转,因此,对于这8个位置需要用一个一维数组存储八个位置。

在进行遍历操作的时候,需要判断m数组的值是否满足地图数组a的值,并且将a中值旋转的四种状态都要做判断。

当然,做函数式处理,也是很重要的。

//解决的c语言坑见评论

代码如下:

void BuildHi(char** Lhi, char* m1){
	m1[0] = Lhi[0][0];
	m1[1] = Lhi[0][1];
	m1[2] = Lhi[0][2];
	m1[3] = Lhi[1][2];

	m1[4] = Lhi[2][2];
	m1[5] = Lhi[2][1];
	m1[6] = Lhi[2][0];
	m1[7] = Lhi[1][0];
}

bool FixedPosition(int i,int j,char**a,char* m1){

	if (a[i - 1][j - 1] == m1[0] && a[i-1][j] == m1[1] && a[i-1][j+1] == m1[2] 
		&& a[i][j+1] == m1[3] &&a[i+1][j+1] == m1[4] &&a[i+1][j] == m1[5] && 
		a[i+1][j-1] ==m1[6] && a[i][j-1] == m1[7]){
		return true;
	}

	if (a[i - 1][j - 1] == m1[6] && a[i - 1][j] == m1[7] && a[i - 1][j + 1] == m1[0]
		&& a[i][j + 1] == m1[1] && a[i + 1][j + 1] == m1[2] && a[i + 1][j] == m1[3] &&
		a[i + 1][j - 1] == m1[4] && a[i][j - 1] == m1[5]){
		return true;
	}

	if (a[i - 1][j - 1] == m1[4] && a[i - 1][j] == m1[5] && a[i - 1][j + 1] == m1[6]
		&& a[i][j + 1] == m1[7] && a[i + 1][j + 1] == m1[0] && a[i + 1][j] == m1[1] &&
		a[i + 1][j - 1] == m1[2] && a[i][j - 1] == m1[3]){
		return true;
	}

	if (a[i - 1][j - 1] == m1[2] && a[i - 1][j] == m1[3] && a[i - 1][j + 1] == m1[4]
		&& a[i][j + 1] == m1[5] && a[i + 1][j + 1] == m1[6] && a[i + 1][j] == m1[7] &&
		a[i + 1][j - 1] == m1[0] && a[i][j - 1] == m1[1]){
		return true;
	}

	return false;
}

void LittleHi(){
	int m, n;
	int hi = 3;
//	char Lhi[3][3];//所在位置矩阵
	char m1[8];	//记录两个旋转矩阵
	scanf("%d%d", &m, &n);
	char **Lhi = (char**)malloc(sizeof(char*) * 3);
	for (int i = 0; i < 3; ++i){//为每行分配4个大小空间
		Lhi[i] = (char*)malloc(sizeof(char) * 3);
	}

	//a is map
	char **a = (char**)malloc(sizeof(char*) * m);//为二维数组分配m行
	for (int i = 0; i < m; ++i){//为每行分配4个大小空间
		a[i] = (char*)malloc(sizeof(char) * n);
	}

	for (int i = 0; i < m; i++)
	{
			scanf("%s",&a[i][0]);
			//a[i][j]=getchar();
	}
	fflush(stdin);
	//Lhi自身有四种状态
	for (int i = 0; i < hi; i++)
	{
			scanf("%s", &Lhi[i][0]);
			//Lhi[i][j] = getchar();
	}

	BuildHi(Lhi, m1);

	//遍历匹配 m行 n列
	for (int i = 1; i < m-1; i++)
	{
		for (int j = 1; j < n-1; j++)
		{
			//表示中间单元格相等
			if (a[i][j] == Lhi[1][1]){
				if (FixedPosition(i, j, a, m1)){
					cout << i+1 << " " << j+1 << endl;
				}
			}
		}
	}
}



int _tmain(int argc, _TCHAR* argv[])
{
	LittleHi();
	return 0;
}


你可能感兴趣的:(C++,hihoCoder)