题目描述:
打印出如下格式的数据:
解题思路:
如果我们将矩阵变一下形状,如下:
这样就变成输出一个三角阵了,简单多了。只是呢,需要在某些行上做一些逆序变换。
奇数 时变换奇数行; 偶数时变换偶数行。
最后按照斜线将数填入原来矩阵中,OK!
C程序如下:
#include
int main()
{
int n;
//输入输出矩阵的大小,不超过100,当然自己可以修改上限值。
printf("Input a num:");
scanf("%d",&n);
int a[100][100]={0};
int b[200][100]={0};
int num=0;
//构造三角阵数形
for(int i=0;i
{
for(int j=0;j<=i;j++)
{
num++;
b[i][j]=num;
}
}
for(i=n-1;i<2*n-1;i++)
{
for(int j=0;j<2*n-1-i;j++)
{
num++;
b[i][j]=num;
}
}
//某些行数据逆序
for(i=0;i
{
int temp=0;
for(int j=0;j<=i/2;j++)
{
temp=b[i][j];
b[i][j]=b[i][i-j];
b[i][i-j]=temp;
}
}
for(i=(n+1)/2*2;i<2*n-1;i+=2)
{
int temp=0;
for(int j=0;j
{
temp=b[i][j];
b[i][j]=b[i][2*n-2-i-j];
b[i][2*n-2-i-j]=temp;
}
}
//按照斜线将数填回原矩阵
for(i=0;i
{
for(int j=0;j<=i;j++)
{
a[i-j][j]=b[i][j];
}
}
for(i=n;i<2*n-1;i++)
{
for(int j=i-n+1;j
{
a[i-j][j]=b[i][j-i+n-1];
}
}
//输出矩阵
for(i=0;i
{
for(int j=0;j
printf("%d ",a[i][j]);
printf("\n");
}
return 0;
}
网络代码(2):
在n*n方阵里填入1,2,…,n*n,要求填成蛇形。例如n=4时方阵为:
10 11 12 1
9 16 13 2
8 15 14 3
7 6 5 4
输入
n(n<=8)
输出
蛇形方阵,要求打印每个数前加一个空格
样例输入
4
有核心代码 如下:
{while(i+1
while(i-1>=0&&!a[i][j-1])a[i][--j]=++tot;
while(i-1>=0&&!a[i-1][j])a[--i][j]=++tot;
while(j+1
其实可以直接赋值为{0}这样每个元素的初值也能全部写为0.。。。
#include
//因为最先竖着赋值,而核心代码里面最初的i在变,所以i代表行。。
int main()
{int a[20][20]={0};//赋初值使每元素的初值都为0,以便判断在赋值时判断下一位是否赋过值。。
int i,j,n,tot=0;
scanf("%d",&n);
i=-1,j=n-1;//使要赋的值时a[++i][j]的位置指向右上角。。。
while(tot
{ while(i+10;
a[++i][j]=++tot; //或者出界时停止竖着赋值。。即跳出这个循环。
while(j-1>=0&&!a[i][j-1])//开始倒退着赋值。。//不过感觉这里应该是j-1>=0才对
a[i][--j]=++tot;
while(i-1>=0&&!a[i-1][j])
a[--i][j]=++tot;
while(j+1
a[i][++j]=++tot;
}
for(i=0;i
{for(j=0;j
{printf("%d ",a[i][j]);}
printf("\n");
}
return 0;
}
网络代码(3):
#include
#define N 5 //1<=N<=20
int main()
{
int a[N][N]={0};
int i,j,iStep,jStep,n=1;
for(i=N-1;i>=0;--i) //倒填
for(j=N-1;j>=0;--j)
a[i][j]=n++;
puts("倒填:");
for(i=0;i
for(j=0;j
printf("%-3d%c",a[i][j],j==N-1?'\n':' ');
for(n=1,i=0,j=0,iStep=1,jStep=-1;n!=N*N+1;) //蛇形填数
{
for(
;i>=0&&i<=N-1&&j>=0&&j<=N-1;
)
{
a[i][j]=n++;
i+=iStep;
j+=jStep;
}
if(j<0||i>N-1)
{
if(i<=N-1)
++j;
else
{
--i;
j+=2;
}
iStep=-1;
jStep=1;
}
if(i<0||j>N-1)
{
if(i<0&&j<=N-1)
++i;
else
{
--j;
i+=2;
}
iStep=1;
jStep=-1;
}
}
puts("\n蛇形填数:");
for(i=0;i
for(j=0;j
printf("%-3d%c",a[i][j],j==N-1?'\n':' ');
for(i=0;i
for(j=0;j
a[i][j]=0;
for(n=1,i=0,j=0,iStep=1,jStep=0; n!=N*N+1;
) {
for(
;i>=0&&i<=N-1&&j>=0&&j<=N-1&&a[i][j]==0;
)
{
a[i][j]=n++;
i+=iStep;
j+=jStep;
}
i-=iStep; //返回多走的那一步
j-=jStep;
if(i>(N-1)/2&&j<=(N-1)/2)
//四个if 根据所处的四个角确定下一轮的走法
{
++j;
iStep=0;
jStep=1;
}
else
if(i>(N-1)/2&&j>(N-1)/2)
{
--i;
iStep=-1;
jStep=0;
}
else
if(i(N-1)/2)
{
--j;
iStep=0;
jStep=-1;
}
else
if(i
{
++i;
iStep=1;
jStep=0;
}
}
puts("\n回转填数:");
for(i=0;i
for(j=0;j
printf("%-3d%c",a[i][j],j==N-1?'\n':' ');
system("pause");
return 0;
}
蛇形,倒填,回转数输出
2011-07-01 8:28
package com.juzhen;
import java.util.Scanner;
public class Test1 {
static int[][] array;//储存数组
public static int get(){
System.out.println("请输入数组边长大小(n>=1)");
Scanner scan=new Scanner(System.in);
int m=scan.nextInt();
return m;
}
//倒填
public static void oper(int n){
array=new int[n][n];
int t=1;
for(int i=n-1;i>=0;i--){
for(int j=n-1;j>=0;j--){
array[i][j] = t++;
}
}
}
//蛇形填数
public static void oper2(int n){
array=new int[n][n];
int t=1;
int start=0,end=0;
for(int i=0;i<2*n-1;i++){
start = (i < n)?0: i-(n-1);
end = (i < n)? i :(n-1);
for(int j=start;j<=end;j++){
if(i%2!=0){
array[i-j][j] = t++;
}else{
array[j][i-j] = t++;
}
}
}
}
//回转数
public static void oper3(int n){
array=new int[n][n];
int t=1;
int p=(n%2==0)?(n/2):(n/2+1);
for(int i=0;i
for(int j=i;j
array[j][i] = t++;
}
for(int k=i;k
array[n-i-1][k] = t++;
}
for(int m=n-i-1;m > i;m--){
array[m][n-i-1] = t++;
}
for(int s=n-i-1;s > i;s--){
array[i][s] = t++;
}
}
if(n%2 != 0){
array[(n/2)][(n/2)]=n*n;
}
}
public static void print(int[][] array){
int n=array.length;
for(int i=0;i
for(int j=0;j
System.out.print(array[i][j]+" ");
}
System.out.println();
}
System.out.println("==============================================");
}
public static void main(String[] args) {
int i=get();
oper(i);
System.out.println("倒填");
print(array);
oper2(i);
System.out.println("蛇形");
print(array);
oper3(i);
System.out.println("回转");
print(array);
}
}