C++面试宝典-循环构建特色矩阵

Published: 17 Mar 2013 Category: 编程

按照以下数字排列的规律,设1的坐标为(0,0),x方向向右为正,y向下为正,输入坐标,输出对应的数字。

12 22 23 24 25

20 ?7 ?8 ? 9 ? 10

19 ?6 ?1 ? 2 ? ?11

18 ?5 ? 4 ? 3 ? 12

17 16 15 14 13

[cpp]

include<stdlib.h>

include<iostream>

include<math.h>

using namespace std;

int max(int x,int y){

return x&gt;y?x:y;

}

void main(){

int x,y;

cin&gt;&gt;x&gt;&gt;y;

int lev=max(abs(x),abs(y));

cout&lt;&lt;&quot;第&quot;&lt;&lt;lev&lt;&lt;&quot;层&quot;&lt;&lt;endl;

int begin=(lev*2-1)*(lev*2-1)+1;

cout&lt;&lt;&quot;开始数字:&quot;&lt;&lt;begin&lt;&lt;endl;

int levlong=lev*2+1;

cout&lt;&lt;&quot;长:&quot;&lt;&lt;levlong&lt;&lt;endl;

bool flag=false;

if(x==lev&amp;&amp;y!=-lev) {printf(&quot;%d&quot;,begin+y-(1-lev));flag=true;}

if(y==lev&amp;&amp;!flag) {printf(&quot;%d&quot;,begin+lev+lev-1+(lev-x));flag=true;}

if(x==-lev&amp;&amp;!flag) {printf(&quot;%d&quot;,begin+lev+lev-1+2*lev+2-y);flag=true;}

if(y==-lev&amp;&amp;!flag) {printf(&quot;%d&quot;,begin+lev+lev-1+2*lev+2*lev+x+2);flag=true;}

}

[/cpp]


P87

zigzag数组的构建

[cpp]

void main(){

? ? int N;

? ? int x=0,y=0,flag=0;//flag=0时表示朝上走,1表示朝下走

? ? cout<<"请输入N"<<endl;

? ? cin>>N;

? ? int *a=(int *)malloc(N*sizeof(int *));

? ? for(int i=0;i<N;i++) a[i]=(int )malloc(Nsizeof(int));//构建二维数组

? ? for(int i=0;i<N*N;i++){

? ? ? ? a[x][y]=i;

? ? ? ? if(x==0&&flag==0){

? ? ? ? ? ? y++;

? ? ? ? ? ? flag=1;

? ? ? ? ? ? continue;

? ? ? ? }

? ? ? ? if(x==N-1&&1==flag){

? ? ? ? ? ? y++;flag=0;

? ? ? ? ? ? continue;

? ? ? ? }

? ? ? ? if(y==0&&1==flag){

? ? ? ? ? ? x++;flag=0;

? ? ? ? ? ? continue;

? ? ? ? }

? ? ? ? if(y==N-1&&0==flag){

? ? ? ? ? ? x++;flag=1;

? ? ? ? ? ? continue;

? ? ? ? }

? ? ? ? if(1==flag){

? ? ? ? ? ? x++;y--;

? ? ? ? ? ? continue;

? ? ? ? }

? ? ? ? if(0==flag){

? ? ? ? ? ? y++;x--;

? ? ? ? ? ? continue;

? ? ? ? }

? ? }

? ? for(int i=0;i<N;i++){

? ? ? ? for(int j=0;j<N;j++){

? ? ? ? ? ? printf("%6d",a[i][j]);

? ? ? ? }

? ? ? ? printf("\n");

? ? }

? ? int xx;

? ? cin>>xx;

}

[/cpp]