加载中...

浙江理工大学入队200题——12A

问题 A: 零基础学C/C++126——回型矩阵

题目描述

输出n*m的回型矩阵

输入

多组测试数据 每组输入2个整数 n和m(不大于10,且不同时为10)

输出

输出n*m的回型矩阵,要求左上角元素是1,(每个元素占2个位置,靠右)

样例输入 Copy

4 3

样例输出 Copy

1 2 3
10 11 4
9 12 5
8 7 6

题解

如上所示,我们有两个思路解决,一个是正常思路,按行然后按列然后再按行···但是会发现最后还要判断最后是按行展开还是按列,比较头疼
那么我们讲解第二种思路,因为我们每个位置的数都是可以根据上一个位置得来的,主要有四种变化,右++,下++,左++,上++,写起来也是比较头疼,不过题目本身就这样没办法。
如果你有更好思路与代码,可以来跟我分享(^U^)ノ~YO

代码(AC)

点击查看代码
#include <stdio.h>
#include <math.h>	
int main (){
	int m,n;
	while(scanf("%d%d",&m,&n)!=EOF)
	{
		int a[m][n];
		for(int i=0;i<m;i++)
		{
			for(int j=0;j<n;j++)
			{
				a[i][j]=0;
			}
		}
		a[0][0]=1;
		int x=0,y=1;
		for(int i=2;i<=m*n;i++)
		{
			a[x][y]=i;
			if(a[x][y]==a[x][y-1]+1 && y+1<n && a[x][y+1]==0) {y++;continue;}
			else if(a[x][y]==a[x][y-1]+1 && (y+1<=n || a[x][y+1]!=0)) {x++;continue;}
			
			if(a[x][y]==a[x-1][y]+1 && x+1<m && a[x+1][y]==0) {x++;continue;}
			else if(a[x][y]==a[x-1][y]+1 && (x+1<=m || a[x+1][y]!=0)){y--;continue;}
			
			if(a[x][y]==a[x][y+1]+1 && y>=0 && a[x][y-1]==0) {y--;continue;}
			else if(a[x][y]==a[x][y+1]+1 && (y>=0 || a[x][y-1]!=0)){x--;continue;}
			
			if(a[x][y]==a[x+1][y]+1 && x>=0 && a[x-1][y]==0) {x--;continue;}
			else if(a[x][y]==a[x+1][y]+1 && (x>=0 || a[x-1][y]!=0)){y++;continue;}
			
		}
		for(int i=0;i<m;i++)
		{
			for(int j=0;j<n;j++)
			{
				printf("%2d",a[i][j]);
				if(j<n-1) printf(" ");
				if(j==n-1) printf("\n");
			}
		}
	}	
	return 0;
}
posted @ 2022-10-29 12:43  shany212  阅读(41)  评论(0编辑  收藏  举报