‘壹’ 蛇形填数 用c语言
#include <stdlib.h>
#include <stdio.h>
void main()
{
int a[21][21], i, j, n;
scanf("%d", &n);
for( i=0; i<n; i++)
for (j=0; j<n; j++)
a[i][j] = -1;
int value = 1, max = n*n;
i = 0, j=n-1;
int inci = 1, incj = 0;
int nexti, nextj;
while(value <= max){
a[i][j] = value ++;
//printf("i=%d, j=%d value=%d\n",i, j, value-1);
nexti = i + inci;
nextj = j + incj;
if( nexti>n-1 || nexti<0 || nextj>n-1 || nextj<0 ||
a[nexti][nextj] != -1) {
if(inci==1 && incj==0) {
inci= 0, incj=-1;
}
else if(inci==0 && incj==-1) {
inci= -1, incj=0;
}else if(inci==-1 && incj==0) {
inci = 0, incj=1;
}else {
inci = 1, incj=0;
}
nexti = i+inci;
nextj = j+incj;
}
i = nexti;
j = nextj;
}
for (i=0; i<n; i++) {
for(j=0; j<n; j++) printf("%3d ", a[i][j]);
printf("\n");
}
}
-------
5
13 14 15 16 1
12 23 24 17 2
11 22 25 18 3
10 21 20 19 4
9 8 7 6 5
‘贰’ c语言 只用循环/选择 输出n阶蛇行/螺旋方阵
#include<iostream.h>
#include<math.h>
/*(1) 螺旋方阵,如下图:
1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7
*/
void op1(int n)
{
int i = 0, //i表示方阵的行数
j = 0; //j表示方阵的列数
int *p = new int[n*n];//p表示方阵数组
int temp = 1;
int t;
for (t = 0; t < ((float)n / 2); t++) //t表示圈数
{
for (; j < n - t; j++) //行数不变,方阵的值随着列数的增加而增加(1,2,3,4,5)(17,18,19)(25)
p[i*n+j] = temp++;
j--;
i++;
for (; i < n - t; i++) //列数不变,方阵的值随着行数的增加而增加(6,7,8,9)(20,21)
p[i*n+j] = temp++;
j--;
i--;
for (; j >= t; j--) //行数不变,方阵的值随着列数的减少而减少(10,11,12,13)(22,23)
p[i*n+j] = temp++;
j++;
i--;
for (; i > t; i--) //列数不变,方阵的值随着行数的减少而减少(14,15,16)(24)
p[i*n+j] = temp++;
j++;
i++;
}
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
{
cout<<p[i*n+j]<<" ";//show.Text += p[i][j] + " ";
}
cout<<endl;
// show.Text += "\r";
}
}
/*
2) 蛇形方阵,如下图:
1 2 6 7
3 5 8 13
4 9 12 14
10 11 15 16
*/
void op2(int n)
{
int i, j, k; //i表示行数,j表示列数,k表示行数和列数的和
int m = 2 * n - 2; //m表示方阵行数最大和列数最大的和
int temp = 1; //temp表示递增变量
int *array = new int[n*n]; //array表示矩阵数组
for (k = 0; k <= m; k++) //根据矩阵的对称性求解;(array[2,0],array[1,1],array[0,2]的行数和列数的和相等)
{
int l = k % 2; //根据k值的递增,改变行数和列数递增的方向;当k为奇数先行后列,当k为偶数先列后行
for (i = 0; i < n; i++)
{
j = k - i;
if (j < n && j >= 0) //判断j的值范围,以免超过数组长度
{
if (l == 1)
{
array[i*n+j] = temp;
}
if (l == 0)
{
array[j*n+i] = temp;
}
temp++;
}
}
}
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
{
/* show.Text += array[i*n+j];
show.Text += " "; */
cout<<array[i*n+j]<<" ";
}
// show.Text += "\n";
cout<<endl;
}
}
int main()
{
int n1,n2;
while(cin>>n1>>n2)
{
op1(n1);
cout<<"***************"<<endl;
op2(n2);
}
return 0;
}
不是我做的,不过你可以也看一下!!!!!!!
‘叁’ 用C语言怎样输出一个N阶蛇形矩阵
先说思想:N=4时候和N=5的时候前面4条斜线上三角是相同的!所以这个可以用递归做。还有个规律很重要就是当2个数的横纵坐标和都是N+1的时候这2个值的和都是N*N+1!问题就很容易解决了!
写个大概:
int **array=NULL;
void main()
{
int n;
scanf("%d",&n);
array=(int**)malloc(n*sizeof(int*));
for(int i=0;i<n;i++)
{
array[i]=(int *)malloc(n*sizeof(int));
}
Testingval(n,n);
for(int i=0;i<n;i++)
{for(int j=0;j<n;j++)
printf("%d ",array[i][j]);
printf("\n");
}
free(array);
}
int Testingval(int a,int n)//a 表示n行中的第几个。。n表示是N界矩阵!
{ if(n==1)
{ array[0][0]==1;
array[n][n]=n*n;
}
else
Testingval(a-1,n);
if(a%2)
{ int i=1;
array[0][a-1]=array[0][a-2]+1;
array[n-1][n-a]=n*n+1-array[0][a];
while(i<a)
{
array[i][a-1-i]=array[i-1][a-i+1]+1;
array[n-1-i][n-a+i]=n*n+1-array[i][a-i];
i++;
}
}
else
{int i=1;
array[a-1][0]=array[a-2][0]+1;
array[n-a][n-1]=n*n+1-array[a-1][0];
while(i<a)
{
array[a-1-i][i]=array[a-i+1][i-1]+1;
array[n-a+i][n-1-i]=n*n+1-array[a-1-i][i];
i++;
}
}
}
}
‘肆’ 用c语言输出蛇形矩阵,我是新手,自己乱想了一个,觉得应该是对的,但输不出,求纠正!!!
其实蛇形数组是有规律可寻的只要2个循环就可以。
蛇形数组你可以看做是一个个正方形做成的,而没有一个正方形又有四个边。
所以第一个循环控制正方形的个数,在第一个循环里面就是第二个循环了,这个就是对应四个边了,所以就有四个小的循环,这样就可以模拟蛇形数组了。
下面给你写写我的代码:
#include <stdio.h>
#define MAX 10
int a[MAX][MAX];
int main() //既然你这里写的是int main,那么你在最后就必须要加上一个return 0;
{
int i,j,n,t;
n = (MAX+1)/2;
t = 0;
for (i=0; i<n; i++)//第一个循环控制个数
{
for(j=i; j<MAX-i-1; j++)//上行
{
t++;
a[i][j] = t;
}
for(j=i; j<MAX-i-1; j++)//右列
{
t++;
a[j][MAX-i-1] = t;
}
for(j=MAX-i-1; j>i; j--)//下行
{
t++;
a[MAX-i-1][j] = t;
}
for(j=MAX-i-1; j>i; j--)//左列
{
t++;
a[j][i] = t;
}
}
for (i=0; i<MAX; i++)
{
for (j=0;j<MAX;j++)
printf("%4d",a[i][j]);
printf("\n");
}
}
‘伍’ C语言写蛇形填数
#include <stdio.h>
#include <stdlib.h>
void func(int n)
{
int i, j, k;
int layer = (n+1) /2, max = n*n;
int **num;
num = (int**)malloc(sizeof(int*) * n);
for( i = 0; i < n; i++)
{
num[i] = (int*)malloc(sizeof(int) * n);
}
k = 1;
for(i = 0; i < layer; i++)
{
for(j = 0; j < n-i*2; j++)
{
num[j+i][n - 1 -i] = k++;
}
for(j = 0; j < n-i*2-1; j++)
{
num[n-i-1][n-2-i-j] = k++;
}
for(j = 0; j < n - i*2 -1; j++)
{
num[n-2-i-j][i] = k++;
}
for(j = 0; j < n - i*2 - 2; j++)
{
num[i][j+1+i]=k++;
}
}
for(i = 0; i < n; i++)
{
for(j = 0; j < n; j++)
{
printf("%3d", num[i][j]);
}
printf("\n");
}
for(i = 0; i < n; i++)
{
free(num[i]);
}
free(num);
}
void main()
{
int n;
printf("n = ");
scanf("%d", &n);
if(n > 100) n = 100;
func(n);
}
‘陆’ 急求!C语言的蛇形方阵!
#include "conio.h"
#include <stdio.h>
#include <stdlib.h>
#define N 6
int mDir[4][2]={ {1,0},{-1,1},{0,1},{1,-1} }; //4个填充方向:左、左下、下、右上,顺序填充
void StepOn(int x,int y,int s[N][N],int len)
{ int i,j,d=0,n=0,begin=1;
while ( 1 )
{ if ( s[y][x]==0 )
{ n++; s[y][x]=n;
if ( begin ) begin=0; //起始点不计
else if ( (d==0||d==2) ) d=(d+1)%4; //如果当前方向是左或下,立即转向
}
else //不空
{ for ( i=0;i<4;i++ ) //顺序测试4个方向
if ( x+mDir[(d+i)%4][0]<len && x+mDir[(d+i)%4][0]>=0 && y+mDir[(d+i)%4][1]<len
&& y+mDir[(d+i)%4][1]>=0 ) //不能超出数组范围
if ( s[y+mDir[(d+i)%4][1]][x+mDir[(d+i)%4][0]]==0 ) //发现合法空位
{ d=(d+i)%4; x+=mDir[d][0]; y+=mDir[d][1]; break; } //修改当前坐标和行进方向
if ( i>=4 ) break; //4个方向都找不到空位,结束
}
}
}
void main()
{ int s[N][N]={0},i,j;
StepOn(0,0,s,N);
for ( i=0;i<N;i++ ) { for ( j=0;j<N;j++ ) printf("%2d ",s[i][j]); printf("\n"); }
getch();
}
本程序的设计思路是:保持当前填充方向,如果是行进方向上有空位则填充,如果越界或是垂直、水平方向填充或越界则立即转向,直到所有方向均试过没有空位为止。
程序中用(d+i)%4的方法使当前方向d的顺序下几个方向都得到测试。既保持了当前方向又能测试所有未测过的方向。
‘柒’ c语言程序设置矩阵中数字以蛇形输出的问题
//以前写得,按蛇形增长方向给每个位置赋值
#include <stdio.h>
#include <stdlib.h>
int *p = NULL; //当前位置
int *s = NULL; //开始位置
int n = 0;
int func(int num, int way)
{
if(num == n*n + 1) return 0;
*p = num;
switch(way) //四个方向, 下,斜上,右,斜下
{
case 0: //向下时 下一个位置在 p + n 处,如当前位置是a[1][0],下个位置应该是a[2][0], 中间相差n个数据
p = p + n;
if( (p -s )% n == 0)
way = 1; //下个方向要么是斜上,要么斜下,由当前是上三角还是下三角决定
else
way = 3;
break;
case 1:
p = p - n + 1;
if(p - s < n -1)
way = 2;
else if((p + 1 - s) % n == 0)
way = 0;
break;
case 2:
p = p + 1;
if((p - s) / n == n -1)
way = 1;
else
way = 3;
break;
case 3:
p = p + n -1;
if((p - s) / n == n - 1)
way = 2;
else if((p - s) % n == 0)
way = 0;
break;
}
return func(num+1, way);
}
void main()
{
printf("n = ");
scanf("%d", &n);
p = (int *)malloc(n * n * sizeof(int));
s = p;
func(1, 0);
p = s;
while(s - p < n*n)
{
printf("%2d ", *s);
if((++s - p) % n == 0)
printf("\n");
}
}
‘捌’ 用C语言输出一个N阶蛇形矩阵,看看这个程序哪里错了
这是我的代码,你参考一下:
#include <stdio.h>
int main()
{
//该程序虽然能通过评测系统的检测,但时间复杂度为O(n^3),因而有待改进
int N=5;
//矩阵阶数
int a[21][21]; //N阶矩阵
int count=0; //矩阵元素值,初始为0
int i,j,k;
for(i=1;i<=2*N-1;i++)
{
//N阶方阵有2*N-1条反对角线,依次遍历之
if(i%2!=0)
{
//当对角线编号为奇数时,各元素按此对角线上的矩阵各元素下标之和从小到大的顺序排列
for(j=1;j<=N;j++)
for(k=1;k<=N;k++)
{
if(j+k==i+1) a[j][k]=++count;
//各元素的下标之和==对角线编号+1
}
}
else
{
//当对角线编号为偶数时,各元素按此对角线上的矩阵各元素下标之和从大到小的顺序排列
for(j=N;j>=1;j--)
for(k=N;k>=1;k--)
{
if(j+k==i+1) a[j][k]=++count;
//各元素的下标之和==对角线编号+1
}
}
}
for(i=1;i<=N;i++)
for(j=1;j<=N;j++)
{
if(j!=N)
{
printf("%4d", a[i][j]);
}
else
{
printf("%4d\n", a[i][j]);
}
}
getchar();
return 0;
}
‘玖’ 用C语言输出一个N阶蛇形矩阵(随意输出n*n个数之后,不要从1开始的,是自己任意输出的n*n个数)。
#include <stdlib.h>
#include <stdio.h>
#include <time.h> /*用到了time函数,所以要有这个头文件*/
int main( void)
{
int i,j,MAX;
int number[400][400] = {0};
printf("请输入一个整数:\n");
scanf("%d",&MAX);
srand((unsigned) time(NULL)); /*播种子*/
for(i = 0; i < MAX; i++)
{
for (j=0;j<MAX;j++)
{
number[i][j] = rand() % 1000; /*产生1000以内的随机整数*/
printf("%5d ", number[i][j]);
}
printf("\n");
}
return 0;
}
这个是随机产生矩阵的值,注意输入的N 请不要超过400......有问题可以MM我,
‘拾’ c语言:建立N阶蛇形方阵并输出
用C语言输出一个N阶蛇形矩阵生成一个按蛇形方式排列自然数1、2、3、…N2
而在你的程序里并没有察觉到这点而是直接输出了
所以那里就是0了
其他0