西电上机题——P70-Z字形扫描

第五次上机


目录

第五次上机

前言

一、题目

二、解题

1.思路

2.代码


前言

自己写的上机作业,可以用于参考

目前处于初步学习中,写的不好见谅


一、题目


二、解题

1.思路

将矩阵按左下到右上的对角线划为两部分 
第一部分看规律发现每次向右上和左下扫描的起点分别为
        0 0   向右上    c 0   给初值c=0,d=1 
        0 1   向左下    0 d 
	           
	    2 0   向右上    c+2 0 
	    0 3   向左下    0   d+2 
			   ... 	    
	   具有相似部分,可用循环解决 
用一个循环用来输出第一部分的向右上和向左下的扫描并输出
第二个循环输出第二部分的向右上和向左下的扫描,n的数的奇偶影响扫描开始位置,所以考虑两种情况
           n-1为奇数时                n-1为偶数时 
	      n-1 1     向右上         n-1 0      向右上
	      2   n-1   向左下         1   n-1    向左下
	                                                     同理用循环进行扫描输出即可 
	      n-1 3     向右上         n-1 2      向右上
	      4   n-1   向左下         3   n-1    向左下
		    ...                         ...
最后输出矩阵最右下角的数 

2.代码

代码如下(示例):

#include<stdio.h>
int main()
{
	int n,a[100][100];
	scanf("%d",&n);
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<n;j++)
		{
			scanf("%d",&a[i][j]);
		}
	}
	if(n==1)printf("%d",a[0][0]);//n等于1的情况 
	else
	//将矩阵按左下到右上的对角线划为两部分 
	//第一部分看规律发现每次向右上和左下扫描的起点分别为
	/*         0 0   向右上    c 0   给初值c=0,d=1 
	           0 1   向左下    0 d 
	           
			   2 0   向右上    c+2 0 
			   0 3   向左下    0   d+2 
			   ... 	    
			   具有相似部分,可用循环 
	*/ 
	//第一个循环用来输出第一部分的向右上和向左下的扫描 
	{
	for(int x,y,b=0,c=1;b<n&&c<n;b=b+2,c=c+2)
	{
		x=b;
		for(int j=0;x>=0;x--,j++)//向右上扫描输出的循环 
           {
	    printf("%d ",a[x][j]);
           }
		y=c;
		for(int i=0;y>=0;i++,y--)//向左下扫描输出的循环
	       {
		printf("%d ",a[i][y]);
	       }
	}
	//第二个循环输出第二部分的向右上和向左下的扫描,考虑两种情况 
	//n的数的奇偶影响扫描开始位置
	/*      n-1为奇数时                n-1为偶数时 
	      n-1 1     向右上         n-1 0      向右上
	      2   n-1   向左下         1   n-1    向左下
	                                                     同理 
	      n-1 3     向右上         n-1 2      向右上
	      4   n-1   向左下         3   n-1    向左下
		    ...                         ...
	*/ 
		if((n-1)%2!=0)//n-1为奇数时
		{
			for(int x,y,b=1,c=2;b<n&&c<n;b=b+2,c=c+2)
		{
		    y=b;
			for(int i=n-1;y<n;i--,y++)
           {
	    printf("%d ",a[i][y]);
           }
		   x=c;
           for(int j=n-1;x<n;x++,j--)
	       {
		printf("%d ",a[x][j]);
	       }
		}
		}
		else if((n-1)%2==0)//n-1为偶数时
		{
			for(int x,y,b=0,c=1;b<n&&c<n;b=b+2,c=c+2)
		{
			y=b;
			for(int i=n-1;y<n;i--,y++)
           {
	    printf("%d ",a[i][y]);
           }
		   x=c;
           for(int j=n-1;x<n;x++,j--)
	       {
		printf("%d ",a[x][j]);
	       }
		}
	    }
	}
	printf("%d",a[n-1][n-1]);//最后输出矩阵最右下角的数 
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值