螺旋方阵 | 蛇形填数

人有多大胆,地有多大产,大力出奇迹,你们还不明白吗?

代码:
#include <iostream>
#include <cstdio>

using namespace std ;

int main()
{
	//定义变量 
	int n ; 
	cin >> n ;			//输入个数 
 
	int i = n ; 		//第一部分
	int ii = i ;		//第一部分遍历几次
	
	int j1 = n - 1 ;  	//第二部分
	int jj1 = j1 ; 		//第二部分遍历几次 
	
	int j2 = n - 1 ;  	//第三部分 
	int jj2 = j2 ; 		//第三部分遍历几次 
	
	int k = n - 2 ; 	//第四部分 
	int kk = k ; 		//第四部分遍历几次。
	
	//定义数组 
	int a[n][n] ;		//二维数组。
	int p = 0 ;			//行数 
	int q = n-1 ; 		//列数 
	int num = 0 ; 		//计数器
	
	//核心代码 
	while ( num != n*n ) {
		
		//第一部分 
		while( i > 0 && ii > 0 ) {
			a[p][q] = (++num) ;
			ii-- ;
			p++ ;		//列数不变,行数自加 
		}
		i -= 2 ;
		ii = i ;
		p-- ;			//修正过量的行数。 
		q-- ; 			//从第一阶段修正到第二阶段 
		
		
		//第二部分 
		while(j1 > 0 && jj1 > 0) {
			a[p][q] = ++num ;
			jj1-- ;
			q-- ;		//行数不变,列数自减 
		} 
		j1 -= 2 ;
		jj1 = j1 ;
		q++ ;			//同上 
		p-- ;			//同上 			 
		
		//第三部分
		while(j2 > 0 && jj2 > 0) {
			a[p][q] = ++num ;
			jj2-- ;
			p-- ;		//列数不变,行数自减 
		} 
		j2 -= 2 ;
		jj2 = j2 ; 
		p++ ;			//同上
		q++ ;			//同上 
		
		//第四部分
		while(k > 0 && kk > 0) {
			a[p][q] = ++num ; 
			kk-- ;
			q++ ;
		} 
		k -= 2 ;
		kk = k ;
		q-- ;			//同上
		p++ ;			//同上
	} 
	
	
	for (int i = 0 ; i < n ; i++ ) {
		for (int j = 0 ; j < n ; j++ ) {
			printf("%3d",a[i][j]) ;
		}
		cout << endl ;
	}/* */
	return 0 ;
 } 

总结

1、本题需要经过两次修正,一次是自加过量的行数或列数的修正,一次是从一部分终点转移到另一部分起点的修正。

2、像这种图案类型的题,一般都会有修正, 有n阶段。

发布了27 篇原创文章 · 获赞 16 · 访问量 1957

猜你喜欢

转载自blog.csdn.net/weixin_43899069/article/details/104259871