最近帮别人写图的二维数组折线读取的算法,在我看来就是找找规律,记录一下,以后或许自己能够用上。
图形有如下9个,每个图表示N*N的二维数组,内部折线表示按照箭头方向的读取顺序。
实现:
分析发现,图a、图b非常简单,读取方式就不再讨论,图c和图d比较类似,只是旋转90度再读而已,所以只针对上面的图c、图e、图f、图i进行算法书写;
图C:
直接上代码:
#include
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
for(int j=0;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
{
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
{
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
{
if(i%M==0)
cout<
cout<
}
getchar();
return 0;
}
图C
#include
#include
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
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
for(int j=0;j
{
orgin[i][j]=sign+1;
result[sign++]=0;
}
sign=0;
for(int i=0;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
{
if(i%10==0)
cout<
cout<
}
getchar();
return 0;
}
图I
#include
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
for(int j=0;j
{
arr[i][j]=sign+1;
result[sign++]=0;
}
sign=0;
for(int i=1;i<=M/2;i++)
{
for(int j=0;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
{
if(i%8==0)
cout<
cout<
}
getchar();
return 0;
}
说一下二维数组旋转90度的算法:
for(int i=0;i
{
for(int j=0;j
{
target[j][M-i-1]=orgin[i][j]; //new 一个target和orgin二维数组,target用来存转晚的二维数组
//cout<
}
}
for(int i=0;i
{
for(int j=0;j
{
cout<
}
cout<
}