纸牌三角形and九宫幻方一些对称数组图形关于旋转和镜像的一些规律总结

关于 对称图形(数字对称图形) 的旋转和镜像问题的一些理解 这里使用两个列子来说明这个情况
①纸牌三角形
②九宫幻方


这里可以使用next_permutation 函数 将1-9数组 全排列 求出所有满足情况的解的个数 但是其中包含了 一些旋转和镜像后相同的解 因此需要排除( 使用除法 ) 找出每种解的重复的个数 n 那么问题为如何得到这个n的值 ------- 个人总结的技巧 这里的三角形 如以本题给出的这个解 进行旋转变换
很明显 旋转周期为三 即通过旋转可以得到三种解 进行镜像 就如同在某一侧放置一块镜子 (补充知识点 ;左右镜像的结果是一样的) 可得到 镜像的周期也为3 所以通过镜像可以得到三个解
那么需要的n的值求出为 6 故将全排列后统计满足条件的解的总数 除以6 即为本题的解
import java.util.Arrays;


public class Two {
	static int cnt = 0;
	public static void main(String[] args) {
		do {
			int sum1 = Arrays[0] + Arrays[1] + Arrays[2] + Arrays[3];
			int sum2 = Arrays[3] + Arrays[4] + Arrays[5] + Arrays[6];
			int sum3 = Arrays[7] + Arrays[8] + Arrays[6] + Arrays[0];
			if (sum1==sum2&&sum2==sum3) {
				cnt++;
			}
		} while (next_permutation(Arrays));
		System.out.println(cnt/6);
	}
	// 方法一 使用 next_permutation
	public static void swap(int nums[], int left, int right) {
		int t = nums[left];
		nums[left] = nums[right];
		nums[right] = t;
	}
	public static void reverse(int nums[], int left, int right) {


		while (left < right) {
			swap(nums, left++, right--);
		}
	}
	public static boolean next_permutation(int nums[]) {
		for (int i = nums.length - 2; i >= 0; i--) {
			if (nums[i] < nums[i + 1]) {
				for (int j = nums.length - 1; j > i; j--) {
					if (nums[j] > nums[i]) {
						swap(nums, i, j);
						reverse(nums, i + 1, nums.length - 1);
						return true;
					}
				}
			}
		}
		return false;
	}
	static int Arrays[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
}



标题:九宫幻方



同样 题目已经说明了 所有的解都是通过 题目给出的这个解进行旋转和镜像得到的 所以 根据上题总结的关于旋转和镜像的规律 我们很容易的得到 旋转周期为4 镜像周期为4 即所有可能的解为8
这样可以将这八个解列举出来 这样之后 这道题就比较简单了


已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:blogdevteam 返回首页