各种排列算法实现

1.

1   3   6   10

2   5   9

4   8 

7

void arrange(int n) { //n为打印数字的个数 
	int note = 1, sum = 0, count = 1; 
	while (sum < n) {
		sum += note;
		note++;
	} 
	int arr[note][note] = {0};//浪费至少一半的空间 
	
	//赋值 
	for (int i = 1; i < note; i++) {
		for (int j = 1; j <= i; j++) {
			if (count <= n) 
				arr[i-j+1][j] = count++; 
			else break;
		} 
		if (count > n) break;	
	}
	
	//打印 
	for (int i = 1; i < note; i++) {
		for (int j = 1; j < note; j++) {
			if (arr[i][j] != 0) 
				printf("%d ", arr[i][j]);			
		}
		printf("\n");
	}
} 

2.

1

4   2

6   5   3

算法和以上相似,改动赋值坐标,打印函数空格也可以加入考虑,例如n = 13等情况

void arrange(int n) { //n为打印数字的个数 
	int note = 1, sum = 0, count = 1; 
	while (sum < n) {
		sum += note;
		note++;
	} 
	int arr[note][note] = {0};//浪费至少一半的空间 
	
	//赋值 
	for (int i = 1; i < note; i++) {
		for (int j = 1; j <= note-i; j++) {
			if (count <= n) 
				arr[i+j-1][j] = count++; 
			else break;
		} 
		if (count > n) break;	
	}
	
	//打印 
	for (int i = 1; i < note; i++) {
		for (int j = 1; j <= i; j++) {
			if (arr[i][j] == 0) 
				printf("  ");
			else 
				printf("%d ", arr[i][j]);
		}
		printf("\n");
	}
}

3.正方形矩阵

1   1   1   1   1

1   2   2   2   1

1   2   3   2   1

1   2   2   2   1

1   1   1   1   1

void arrange(int n) { //n为正方形矩阵的行列数
	int arr[n][n];
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			int min = (i-0);
			if (min > (n-1-i)) min = (n-1-i);
			if (min > (j-0)) min = (j-0);
			if (min > (n-1-j)) min = (n-1-j);
			arr[i][j] = min+1;
		}
	} 
	
	//打印
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) 
			printf("%d ", arr[i][j]);
		printf("\n");
	} 
} 

4.蛇形填数

在n*n方陈里填入1,2,...,n*n,要求填成蛇形。例如n=4时方陈为:

1   2   3   4

12 13 14 5

11 16 15 6

10  9   8  7

void arrange(int n) {  
	int arr[100][100], count = 0, x = 0, y = -1;
	while (count < n*n) {
		while (y+1 < n && arr[x][y+1] == 0) {arr[x][++y] = ++count;}
		while (x+1 < n && arr[x+1][y] == 0) {arr[++x][y] = ++count;}
		while (y-1 >= 0 && arr[x][y-1] == 0) {arr[x][--y] = ++count;}
		while (x-1 >= 0 && arr[x-1][y] == 0) {arr[--x][y] = ++count;}
	}
	
	for (int i = 0 ; i < n; i++) {
		for (int j = 0; j < n; j++) 
			printf("%d ", arr[i][j]);
		printf("\n");
	}
		
} 

猜你喜欢

转载自blog.csdn.net/weixin_40571331/article/details/82819999
今日推荐