『壹』 蛇形填數 用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