题目描述:
在n*n方阵里填入1,2,...,n*n,要求填成蛇形。例如n=4时方阵为:
10 11 12 1
9 16 13 2
8 15 14 3
7 6 5 4
代码一如下:
#include<cstdio>
#include<cstring>
using namespace std;
#define MAXN 100+1 //最大填100*100的方阵且下标从1开始
int map[MAXN][MAXN];
int main()
{
int x=1,y,n,number=1;
scanf("%d",&n);
y=n;
memset(map,0,sizeof(map)); //清零方阵同时做访问标记
while(number<=n*n)
{
while(x!=n+1&&!map[x][y]) //循环结束时x已出界 由上到下
map[x++][y]=number++;
--x;
--y;
while(y!=0&&!map[x][y]) //循环结束时y已出界 由右到左
map[x][y--]=number++;
++y;
--x;
while(x!=0&&!map[x][y]) //循环结束时x已出界 由下到上
map[x--][y]=number++;
++x;
++y;
while(y!=n+1&&!map[x][y]) //循环结束时y已出界 由左到右
map[x][y++]=number++;
--y;
++x;
}
for(int i=1;i<=n;++i)
{
for(int j=1;j<=n;++j)
{
printf("%-6d",map[i][j]);
}
printf("\n");
}
return 0;
}
代码二(分治法)如下:
#include<iostream>
using namespace std;
const int MAXN=25;
int data[MAXN][MAXN];
void Full(int number,int begin, int size){
int i,j,k;
if(size==0){
return;
}
if(size==1){
data[begin][begin]=number;
return;
}
i=begin;
j=begin;
for(k=0;k<size-1;++k){
data[i][j]=number++;
++i;
}
for(k=0;k<size-1;++k){
data[i][j]=number++;
++j;
}
for(k=0;k<size-1;++k){
data[i][j]=number++;
--i;
}
for(k=0;k<size-1;++k){
data[i][j]=number++;
--j;
}
Full(number,begin+1,size-2);
}
int main(){
int size;
cin>>size;
Full(1,0,size);
for(int i=0;i<size;++i){
for(int j=0;j<size;++j){
cout<<data[i][j]<<"\t";
}
cout<<endl;
}
return 0;
}
代码一运行结果:
代码二运行结果: