C++面试宝典-循环构建特色矩阵
按照以下数字排列的规律,设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>y?x:y;
}
void main(){
int x,y;
cin>>x>>y;
int lev=max(abs(x),abs(y));
cout<<"第"<<lev<<"层"<<endl;
int begin=(lev*2-1)*(lev*2-1)+1;
cout<<"开始数字:"<<begin<<endl;
int levlong=lev*2+1;
cout<<"长:"<<levlong<<endl;
bool flag=false;
if(x==lev&&y!=-lev) {printf("%d",begin+y-(1-lev));flag=true;}
if(y==lev&&!flag) {printf("%d",begin+lev+lev-1+(lev-x));flag=true;}
if(x==-lev&&!flag) {printf("%d",begin+lev+lev-1+2*lev+2-y);flag=true;}
if(y==-lev&&!flag) {printf("%d",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]