几种二维数组的折线读取实现

本文介绍了几种特定图形的二维数组读取算法实现,包括不同形状的路径读取和旋转操作。通过具体示例代码展示了如何按照指定顺序遍历二维数组。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近帮别人写图的二维数组折线读取的算法,在我看来就是找找规律,记录一下,以后或许自己能够用上。

图形有如下9个,每个图表示N*N的二维数组,内部折线表示按照箭头方向的读取顺序。

实现:

分析发现,图a、图b非常简单,读取方式就不再讨论,图c和图d比较类似,只是旋转90度再读而已,所以只针对上面的图c、图e、图f、图i进行算法书写;

图C:

直接上代码:

#include <iostream>
using namespace std;
int main()
{
	const int M=8;
	const int N=8;
	//int** arr = new int*[M];//,
	int (*arr)[M] = new  int [M][N];
	int  *result=new int[M*N];
	int sign=0;
	//int x=-1,y=-1;
	for(int i=0;i<M;i++)
		for(int j=0;j<N;j++)
		{
			arr[i][j]=sign+1;
			result[sign++]=0;
		}
		sign=0;
	for(int i=1;i<=M+N;i++)
	{
		if(i<=M)
		{
			if(i%2==0)
			{//偶数的情况
				for(int ou=0;ou<i;ou++)
				{
					result[sign++]=arr[ou][i-ou-1];
				}
			}
			else
			{
				for(int ji=i-1;ji>=0;ji--)
				{
					result[sign++]=arr[ji][i-ji-1];
				}
			}
		}else
		{
			if(i%2==0)
			{//偶数的情况
				for(int ou=i-M;ou<M;ou++)
				{
					result[sign++]=arr[ou][i-ou-1];
				}
			}
			else
			{
				for(int ji=M-1;ji>i-M-1;ji--)
				{
					result[sign++]=arr[ji][i-ji-1];
				}
			}
		}

	}
	for(int i=0;i<M*M;i++)
	{
		if(i%M==0)
			cout<<endl;
		cout<<result[i]<<\t"";
	}
	getchar();

	return 0;
}

图C

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

void (int** a, const int size , int * b)
{
	int num = 0 , start = 0;
	for(int len = size; len > 0; len-= 2)
	{
		for(int i = 0; i < len; i++)
			b[num++] = a[start][start+i];
		for(int i = 0; i < len - 2; i++)
			b[num++] = a[start + 1 + i][size-1-start];
		for(int i = 0; i < len; i++)
			b[num++] = a[size-1-start][size-1-start-i];
		for(int i = 0; i < len-2; i++)
			b[num++] = a[size-2-start - i][start];
		start++;
	}
}
int main()
{
	const int size = 6;
	int** a = new int *[size];
	for(int i = 0; i < size; i++)
		a[i] = new int[size];
	int b[size * size];
	int x = 1;
	for(int i = 0; i < size; i++)
		for(int j = 0; j < size; j++)
			a[i][j] = x++;
	for(int i = 0; i < size; i++)
	{
		for(int j = 0; j < size; j++)
			printf("%d\t" , a[i][j]);
		puts("\n");
	}
	puts("\n");
	create(a , size , b);
	for(int i = 0; i < size * size; i++)
		printf("%d\t" , b[i]);
	system("pause"); 
}


图F

#include <iostream>
using namespace std;
int main()
{
	const int M=10;
	const int N=10;
	int (*orgin)[M] = new  int [M][N];
	int  *result=new int[M*N];
	int sign=0;
	for(int i=0;i<M;i++)
		for(int j=0;j<N;j++)
		{
			orgin[i][j]=sign+1;
			result[sign++]=0;
		}
		sign=0;
	for(int i=0;i<M;i++)
	{
		for(int j=0;j<=i*2;j++)
		{
			if(i%2==0)
			{
				if(j<=i)
				{
					result[sign]=orgin[j][i];
				}
				else
				{
					result[sign]=orgin[i][2*i-j];
				}
			}
			else
			{
				if(j<=i)
				{
					result[sign]=orgin[i][j];	
					
				}
				else
				{
					result[sign]=orgin[2*i-j][i];
				
				}
			}
			sign++;

		}
	}
	for(int i=0;i<M*M;i++)
	{
		if(i%10==0)
		cout<<endl;
		cout<<result[i]<<"\t";
		
	}
	getchar();
	return 0;
}

图I

#include <iostream>
using namespace std;
int main()
{
	const int M=8;
	const int N=8;
	int (*arr)[M] = new  int [M][N];
	int  *result=new int[M*N];
	int sign=0;
	for(int i=0;i<M;i++)
		for(int j=0;j<N;j++)
		{
			arr[i][j]=sign+1;
			result[sign++]=0;
		}
		sign=0;
	for(int i=1;i<=M/2;i++)
	{
		for(int j=0;j<M;j++)
		{
			if(i%2==0)
			{
				result[sign++]=arr[M-j-1][i*2-2];
				result[sign]=arr[M-j-1][i*2-1];
			}
			else
			{
				result[sign++]=arr[j][i*2-2];
				result[sign]=arr[j][i*2-1];
			}
			sign++;
		}
	}
	for(int i=0;i<M*M;i++)
	{
		if(i%8==0)
			cout<<endl;
		cout<<result[i]<<"\t";

	}
	getchar();
	return 0;
}

说一下二维数组旋转90度的算法:

for(int i=0;i<M;i++)
{
	for(int j=0;j<M;j++)
	{
		target[j][M-i-1]=orgin[i][j]; //new 一个target和orgin二维数组,target用来存转晚的二维数组
		//cout<<target[i][j];
	}
}
for(int i=0;i<M;i++)
{
	for(int j=0;j<M;j++)
	{
		cout<<target[i][j]<<"\t";
	}
	cout<<endl;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值