矩阵填数-倒填、螺旋、蛇形

/*矩阵倒填*/

#include <stdio.h>

#define N 20

int main()
{
        int i, j, n, m;
        int f[N][N] = {0};
        
        printf("input a intger:");
        scanf("%d", &n);

        printf("\n");
        
        m = n * n;
        for (i=0; i<n; i++) {
                for (j=0; j<n; j++)
                        f[i][j] = m--;                                
        }

        for (i=0; i<n; i++) {
                for (j=0; j<n; j++)
                        printf("%3d", f[i][j]);
                printf("\n");                
        }
	
        printf("\n");
	
	return 0;	
}

/*螺旋矩阵*/

#include <stdio.h>
#include <stdlib.h>

#define N 20

int main()
{
        int x, y, n, val;
        int f[N][N] = {0};
        
        printf("input a integer:");
        scanf("%d", &n);
        printf("\n");
			
	val = 1;
        for (x=0; x<(n+1)/2; x++) {
                
                /*right*/ // 1 2 3 4
                for (y=x; y<n-x; y++)
                        f[x][y] = val++;                
                
                /*down*/  // 5 6 7
                for (y=x+1; y<n-x; y++)
                        f[y][n-x-1] = val++;
                
                /*left*/ //  8 9 10      
                for (y=n-x-2; y>=x; y--)
                        f[n-x-1][y] = val++;

                /*up*/   //  11 12
                for (y=n-x-2; y>x; y--)
                        f[y][x] = val++;        
        }        
        
        /*输出螺旋数组*/
        for (x=0; x<n; x++) {
                for (y=0; y<n; y++)
                        printf("%5d", f[x][y]);
                printf("\n\n");
        }
        printf("\n");

        return 0;
 }

/*螺旋矩阵_递归实现*/

#include <stdio.h>
#include <stdlib.h>

#define N 20

void change(int i, int j, int k, int m, int l, int (*t)[20])
{
	if (!m)
		return;
	
	for (j=i; j<l-i; j++)
		t[i][j] = k++;

        for (j=i+1; j<l-i; j++)
                t[j][l-i-1] = k++;
  
        for (j=l-i-2; j>=i; j--)
                t[l-i-1][j] = k++;

        for (j=l-i-2; j>i; j--)
                t[j][i] = k++;

	change(i+1, j, k, --m, l, t);	   			
}

int main()
{
	int x, y, n, m, val;
	int f[N][N] = {0};
	
        printf("input a integer:");
        scanf("%d", &n);
        printf("\n");
        
        x = 0;
        y = 0;
        val = 1;
        m = (n+1)/2;
        change(x, y, val, m, n, f);
	
	/*输出螺旋数组*/
        for (x=0; x<n; x++) {
                for (y=0; y<n; y++)
                        printf("%5d", f[x][y]);
                printf("\n\n");
        }
        printf("\n");
	
	return 0;	
}

/*蛇形填数*/

#include <stdio.h>
#include <stdlib.h>

#define N 20

int main()
{
        int i, x, y, x1, y1, n, val, flag;
        int f[N][N] = {0};
        
        printf("input a integer:");
        scanf("%d", &n);
        printf("\n\n");
			
	val = 1;
        x = y = 0;
        
        /*把矩阵斜看成一行一行 */
        /*例如  1 | 2 3 | 4 5 6 | 7 8 9 10 | 11 12 13 | 14 15 | 16  */        
	for (i=0; i<2*n-1; i++) {
                if (x != y) {
                        x1 = x;
                        y1 = y;
                        flag = x1 < y1 ? 1 : 0;
                        while (x1 != y) {
                                f[x1][y1] = val++;
                                if (flag) {
                                        x1 = x1 + 1;
                                        y1 = y1 - 1;        
                                } else {
                                        x1 = x1 - 1;
                                        y1 = y1 + 1;
                                }
                                        
                        }
                        f[x1][y1] = val++;
                        x = x1;
                        y = y1;                        
                } else {
                        f[x][y] = val++;
                        x++; //(0,0) --> (1,0)
                        continue;
                }
                
                /*坐标变化 每行处理*/
                if (i < n-1) {        //以对角线 区分上半部分和下半部分的坐标变化
                        x = x == 0 ? x : (x + 1);  
                        y = y == 0 ? y : (y + 1);      
                } else {
                        x = x < y ? (x + 1) : x;
                        y = y < x ? (y + 1) : y;
                }
                                       
        }	        
        
        /*输出蛇形数组*/
        for (x=0; x<n; x++) {
                for (y=0; y<n; y++)
                        printf("%5d", f[x][y]);
                printf("\n\n");
        }
        printf("\n");

        return 0;
 }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值