当前位置:首页 » 操作系统 » 螺线矩阵算法

螺线矩阵算法

发布时间: 2022-10-08 11:35:12

❶ 一个矩阵算法,用C#语言

这是螺旋矩阵,

方法:GetSpiralMatrix();

参数row:矩阵的大小(任意正整数)

楼主的问题,分别输入 1,3,5即可打印出来。

staticvoidMain(string[]args)
{
int[,]arr=GetSpiralMatrix(5);
for(inti=0;i<arr.GetLength(0);i++)
{
for(intj=0;j<arr.GetLength(1);j++)
{
Console.Write(arr[j,i]+" ");
}
Console.WriteLine();
}
Console.Read();
}
//螺旋矩阵(由内向外)
staticint[,]GetSpiralMatrix(introw)
{
int[,]intArr=newint[row,row];
intx=row%2==0?row/2-1:row/2;//计算初始x,y坐标在正中间
inty=x;
intm=1;//初始腰围...
intn=0;
stringtype="R";
for(inti=1;i<=row*row;i++)
{
intArr[x,y]=i;
switch(type)
{
case"R"://向右
x++;n++;
if(m==n){type="D";n=0;}
break;
case"D"://向下(腰围加粗)
y++;n++;
if(m==n){m++;type="L";n=0;}
break;
case"L"://向左
x--;n++;
if(m==n){type="U";n=0;}
break;
case"U"://向上(腰围加粗)
y--;n++;
if(m==n){m++;type="R";n=0;}
break;
}
}
returnintArr;
}

不清楚的话可以追问,请参考并采纳,谢谢!

❷ 求一个C语言程序设计:螺旋矩阵.

螺旋矩阵:
#include<stdio.h>
main()
{
int a,b,k,n,i,j,a1,b1,m;
int lines[50][50];
scanf("%d",&n);
i=j=0;a=b=n;a1=b1=0;k=1;
if(n==1)
printf(" 1\n");
else
{
for(m=1;m<2*n;m++)
{
if(m%4==1)
{
for(;j<b;j++)
{
lines[i][j]=k;
k++;
}
i++;
j--;
b--;
}
else if(m%4==2)
{
for(;i<a;i++)
{
lines[i][j]=k;
k++;
}
j--;
i--;
a--;
}
else if(m%4==3)
{
for(;j>=b1;j--)
{
lines[i][j]=k;
k++;
}
i--;
j++;
b1++;
}
else
{
for(;i>=a1+1;i--)
{
lines[i][j]=k;
k++;
}
j++;
i++;
a1++;
}
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{ if(j==0)printf(" %2d ",lines[i][j]);
else if(j==n-1)printf("%2d",lines[i][j]);
else
printf("%2d ",lines[i][j]);
}
printf("\n");
}
}
}
和的话加一下就是了;
至于你说的那些个积什么的,比较麻烦。自己再弄弄吧。

❸ 急求,用C语言实现N阶螺旋数字方阵,谢谢

1. 编程,统计在所输入的50个实数中有多少个正数、多少个负数、多少个零。

2. 编程,计算并输出方程X2+Y2=1989的所有整数解。

3. 编程,输入一个10进制正整数,然后输出它所对应的八进制、十六进制数。

4. 一个数如恰好等于它的因子之和,这个数就称为“完数”。编程序找出1000以内的所有完数,并输出其因子(6是一个"完数",它的因子是1,2,3)。

5. 输入一个正整数,输出它的所有质数因子(如180的质数因子为 2、2、3、3、5)。

6. 输入20个整数存入一数组,输出其中能被数组中其它元素整除的那些数组元素。

7. 输入两个数组(数组元素个数自定),输出在两个数组中都出现的元素(如a[5]=,b[6]=,则输出3、5)。

8. 输入两个数组(数组元素个数自定),输出在两个数组中都不出现的元素(如a[5]=,b[6]=,则输出2、4、6、3、7、9、10、-1)。

9.编程,将字符数组S2中的全部字符拷贝到字符数组S1中(不用strcpy函数)。

10.给定年份year,判别该年份是否闰年(定义一个宏以判别该年份是否闰年)。

11.输入一行小写字母后,将字母变成其下一字母(a变成b、b变成c、c变成d、…、x变成y、y变成z、z变成a)输出。

12. 编写一个函数,处理n行、n列的二维数组:将每一行的元素同除以该行上绝对值最大的元素。

13. 编写函数,求任意阶多项式 a0+a1X+a2X2+...+anXn 的值并返回多项式的值。

14. 设计一个函数,使给出一个数的原码,能得到该数的补码。

15. 编写函数,求m行、n列的二维数组全体元素中负数的个数。

16. 编写函数,返回在一个整数组中出现次数最多的数及其出现次数。

17.编一个程序,打入月份号,输出该月的英文月名,要求用指针数组处理。

18.编写递归函数,将输入的字符串按与输入相反的顺序输出。

19. 编写函数,在n个元素的一维数组中,统计比相邻元素大的数组元素个数并将统计数返回(不考虑a[0]和a[n-1]),要求以指针变量而不是数组名作参数。

20. 编写函数,在n个元素的一维数组中,找出最大值、最小值并传送到调用函数。

21. 编写一个函数,统计m行n列二维数组中有多少个正数、多少个负数,多少个零,并返回统计结果。

22. 写一函数,在给定的一行以"."结束的字符中,找出最长的单词并输出。

23. 编写一个函数print,打印一个学生的成绩数组,该数组中有5个学生的数据记录,每个记录包括num,name,score[3],用主函数输入这些记录,用print函数输出这些记录。

24. 把文本文件d1.dat复制到文本文件d2.dat中,要求仅复制d1.dat中的英文字符。

25. 编程,把文本文件d1.dat复制到d2.dat(其中空格字符不复制)。

26. 编程,把文本文件d1.dat复制到d2.dat(其中大写英文字母要转换为小写字母)。

27. 把文本文件d1.dat复制到文本文件d2.dat中,要求仅复制d1.dat中除英文字符和数字以外的其它内容。

28. 求出1至100之间的素数(只能被1和自身整除的数)并顺序写入文件su.dat。

29.磁盘文件a1和a2,各自存放一个已按字母顺序排好的字符串,编程合并二个文件到a3文件中,合并后仍保持字母顺序(如a1中存放:"accel",a2中存放"ilrz",则a3中为"acceillrz")。

30.已知顺序文件C.DAT 存放着程序设计基础的考试成绩,每个记录包含学号(8位字符)和成绩(三位整数)两个数据项。编制程序,从文件中读入学生成绩,将大于或等于60分的学生成绩再形成一个新的文件SCORE60.DAT保存在A盘上,并显示出学生总人数(少于1000)、平均成绩和及格人数。

31.已知head指向一个带头结点的单向链表,链表中每个结点包含数据域和指针域。请编写程序实现如图所示链表的逆置。

若原链表为:

head

a

b

C ∧

逆置后链表应为:

head

c

b

a ∧

32、编制函数实现在一个带头结点(head)的单向链表(数据有序)中删除相同数据的结点(相同数据的结点只保留一个)。

33、编制一程序,将字符computer赋给一个字符数组,然后从第一个字母开始间隔的输出该串。请用指针完成。

34、编制一程序,将字符串的第m个字符开始的全部字符复制成另一个字符串,要求在主函数中输入字符串及m的值并输出复制结果,在被调用函数中完成复制。

35、有4名学生每个学生考4门课程,要求在用户输入学生学号以后能输出该生的全部成绩,用指针型函数来实现。请编写函数float *search().

main()

,,,};

float search(),p;

int I,m;

printf(“enter the number of student:”);

scanf(“%d”,&m);

printf(“the score of NO.%dare:\n”,m);

p=search(score,m);

for(I=0;I<4;I++)

printf(“%52f\t”,*(p+I));

}

float search(float (pointer)[4],int n)

{}

36、有4名学生每个学生考4门课程,要求在用户找出有不及格课程的学生学号并输出全部成绩,用指针来实现。

37、编制一程序实现将十进制数转换成二进制数,并存放于一维数组b中,然后输出。

38、以下函数p的功能是用递归方法计算x的n阶勒让德多项式的值。已有有调用语句p(n,x);请编写p函数。递归公式如下:

1

X

PX(X)=

((2N-1)*X* Pn-1(X)-(n-1)* Pn-2(X)/n

39、编程实现如下5*5阶的螺旋方阵。

1
2
3
4
5

16
17
18
19
6

15
22
21
20
7

14
23
24
25
8

13
12
11
10
9

40、编一程序实现求所有不超过200的N值,N的平方是具有对称性质的回文数。所谓回文数就是将一个数从左向右与从右向左读是一样的,例如34543和1234321都是回文数。

41、编写一函数实现将一个整数按逆序存放到一个数组中。

42、请编写程序:从键盘输入一个字符串,将其中的小写字母全部转换成大写字母,输出到磁盘文件“upper.txt”中去保存。输入的字符串以“!”结束。

43、设文件number.dat中存放了一组整数。请编程统计并输出文件中正整数、负整数和零的个数。

44、请编程:从键盘上读入一个16进制无符号数m,调用函数rightrot将m中的原始数据循环右移n位。并输出移位前后的内容。

45、设计一递归函数计算下列函数:

PX(X,N)=X-X2+X3-X4+……+(-1)N-1XN(N>0)

46、设计一递归函数计算x的n次方。

47、设计一递归函数实现将小于32768的整数按逆序输出。

48、设计一递归函数实现将小于32768的整数按逆序输出。

49、设计一递归函数实现如下函数:

ack(m,n)= n+1 当m=0时

ack(m-1,1) 当n=0时

ack(m-1,ack(m,n-1)) 当n>0,m>0时

50、设计一递归函数实现将任一正整数转达换成二进制数。

❹ 螺旋矩阵的三种算法 Pascal

①:设圆心为x1、y1,求得圆心与坐标点x、y之间的距离L=sqrt((x-x1)*(x-x1)+(y-y1)*(y-y1)),然后再判断L是否大于1并且小于2,若判断结果为真,则输入的坐标点x,y在圆环内部。

②:问题:输入一个数n,输出n^2数阵,数阵为数字漩涡排列。
例:输入1,输出 1
输入2,
输出
1 2
3 4
输入3
输出
1 2 3
8 9 4
7 6 5
输入4
输出
1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7
是这个题么?
program hhs;
var
a,b,t,x:integer;
s:array[0..1000,0..1000]of integer;
begin
readln(x);
for a:=1 to 6 do begin
s[0,a]:=1;
s[x+1,a]:=1;
s[a,0]:=1;
s[a,x+1]:=1;
end;
t:=1;a:=1;b:=1;
while t<=x*x do begin
s[a,b]:=t;
if (s[a-1,b]<>0)and(s[a+1,b]=0)and(s[a,b+1]<>0)then a:=a+1
else
if (s[a,b-1]=0)and(s[a+1,b]<>0)and(s[a,b+1]<>0)then b:=b-1
else
if (s[a-1,b]=0)and(s[a+1,b]<>0)and(s[a,b-1]<>0)then a:=a-1
else b:=b+1;
t:=t+1
end;
for a:=1 to x do begin
for b:=1 to x do
write(s[a,b]:5);
writeln;
end;
end.

❺ 谁有螺旋矩阵的说明

关于螺旋矩阵的说法不一,这里指的是形如
21 22................
20 7 8 9 10
19 6 1 2 11
18 5 4 3 12
17 16 15 14 13
的矩阵。

问题有两个:
1. 编程实现输出这个矩阵
2. 设1点的坐标是(0,0),x方向向右为正,y方向向下为正.例如:7的坐标为(-1,-1) ,2的坐标为(0,1),3的坐标为(1,1).编程实现输入任意一点坐标(x,y),输出所对应的数字。

1. 第一个问题我是采用模拟进行构造的,可以看到从1开始的方向变化始终是 right->down->left->up,
所持续走的长度为1->1->2->2->3->3->...,发现了这个规律不难写出代码了!注意下面我把1的位置设置
在((n-1)/2, (n-1)/2)的位置。

void Simulate(int n)
{
int x, y;
x = y = (n - 1) / 2; //1的位置
data[x][y] = 1;
int len = 1;
int count = 0;
int num = 2;
DIRECTION dir = RIGHT;
while(num <= n * n)
{
for(int i = 0; i < len; i++)
{
switch(dir)
{
case LEFT:
--y; break;
case RIGHT:
++y; break;
case UP:
--x; break;
case DOWN:
++x; break;
default: break;
}
data[x][y] = num++;
}
count++;
if(count == 2)
{
count = 0;
len++;
}
dir = (DIRECTION)((dir + 1) % 4);
}
}

2. 第二个问题我也是先找出规律,然后进行模拟。
首先,不难看出n*n的螺旋矩阵的右下角的坐标一定是(m, m),这里m=n-1
通过观察,可以看出 n=1的时候,右下角(0,0)的值为1,当n=2的时候,右下角(1,1)的坐标值为(3,3),当n=3的时候,右下角(2,2)的坐标值为13.直觉告诉我,这个值是关于n的二次函数,设f(n) = a*n^2 + b*n + c
联立方程组,可以求得a,b,c。 最终算出来的f(n) = 4*n^2 - 2*n + 1
下面再根据(x,y)和右下角(n-1,n-1)之间的关系,计算出值即可。这里要注意当x的值与n-1相同时,应优先考虑y与-m是否有联系。这就要求在函数中要注意x,y的判断先后顺序了。
代码如下:

//以(1,1)所在位置作为原点,向右作为x正半轴,向下作为y正半轴
int GetValue(int x, int y)
{
int m = max(abs(x), abs(y));
int rightBottom = m * m * 4 - 2 * m + 1;
int value = 0;
if(x == -m)
{
value = rightBottom + 2 * m + m - y;
}
else if( y == m)
{
value = rightBottom + m - x;
}
else if(y == -m)
{
value = rightBottom + 4 * m + x + m;
}
else if( x == m )
{
value = rightBottom - (m - y);
}

return value;
}

❻ 急!求JAVA螺旋矩阵的N*N算法(必须能运行的!!)

呵呵,大一做过的
package bao;

public class Juzhen {
public static void main(String[] args){
int k=1,i=0,j=0,m=0;
System.out.println("输入矩阵大小:");
int n=SavitchIn.readLineInt();
int[][] A=new int[n][n];
for(m=0;m<n;m++){
for(i=m,j=m;j<n-m;j++){
A[i][j]=k;k++;
}j--;
for(i=i+1;i<n-m;i++){
A[i][j]=k;k++;
}i--;
for(j=j-1;j>=m;j--){
A[i][j]=k;k++;
}j++;
for(i=i-1;i>m;i--){
A[i][j]=k;k++;
}i++;
}
for(int a=0;a<n;a++){
for(int b=0;b<n;b++){
System.out.print(A[a][b]+"\t");
}
System.out.println();
}
}
}

其中SavitchIn为
public class SavitchIn
{

/***
*Reads a line of text and returns that line as a String value.
*The end of a line must be indicated either by a new-line
*character '\n' or by a carriage return '\r' followed by a
*new-line character '\n'. (Almost all systems do this
*automatically. So, you need not worry about this detail.)
*Neither the '\n', nor the '\r' if present, are part of the
*string returned. This will read the rest of a line if the
*line is already partially read.
****/
public static String readLine()
{
char nextChar;
String result = "";
boolean done = false;

while (!done)
{
nextChar = readChar();
if (nextChar == '\n')
done = true;
else if (nextChar == '\r')
{
//Do nothing.
//Next loop iteration will detect '\n'
}
else
result = result + nextChar;
}

return result;
}
public static int readLineInt()
{
String inputString = null;
int number = -9999;//To keep the compiler happy.
//Designed to look like a garbage value.
boolean done = false;

while (! done)
{
try
{
inputString = readLine();
inputString = inputString.trim();
number = Integer.parseInt(inputString);
done = true;
}
catch (NumberFormatException e)
{
System.out.println(
"Your input number is not correct.");
System.out.println("Your input number must be");
System.out.println("a whole number written as an");
System.out.println("ordinary numeral, such as 42");
System.out.println("Minus signs are OK,"
+ "but do not use a plus sign.");
System.out.println("Please, try again.");
System.out.println("Enter a whole number:");
}
}

return number;
}
}

❼ 螺旋矩阵的三种算法 Pascal

①:设圆心为x1、y1,求得圆心与坐标点x、y之间的距离L=sqrt((x-x1)*(x-x1)+(y-y1)*(y-y1)),然后再判断L是否大于1并且小于2,若判断结果为真,则输入的坐标点x,y在圆环内部。
②:问题:输入一个数n,输出n^2数阵,数阵为数字漩涡排列。
例:输入1,输出
1
输入2,
输出
1
2
3
4
输入3
输出
1
2
3
8
9
4
7
6
5
输入4
输出
1
2
3
4
12
13
14
5
11
16
15
6
10
9
8
7
是这个题么?
program
hhs;
var
a,b,t,x:integer;
s:array[0..1000,0..1000]of
integer;
begin
readln(x);
for
a:=1
to
6
do
begin
s[0,a]:=1;
s[x+1,a]:=1;
s[a,0]:=1;
s[a,x+1]:=1;
end;
t:=1;a:=1;b:=1;
while
t<=x*x
do
begin
s[a,b]:=t;
if
(s[a-1,b]<>0)and(s[a+1,b]=0)and(s[a,b+1]<>0)then
a:=a+1
else
if
(s[a,b-1]=0)and(s[a+1,b]<>0)and(s[a,b+1]<>0)then
b:=b-1
else
if
(s[a-1,b]=0)and(s[a+1,b]<>0)and(s[a,b-1]<>0)then
a:=a-1
else
b:=b+1;
t:=t+1
end;
for
a:=1
to
x
do
begin
for
b:=1
to
x
do
write(s[a,b]:5);
writeln;
end;
end.

❽ 螺旋矩阵的三种算法 Pascal

①:设圆心为x1、y1,求得圆心与坐标点x、y之间的距离L=sqrt((x-x1)*(x-x1)+(y-y1)*(y-y1)),然后再判断L是否大于1并且小于2,若判断结果为真,则输入的坐标点x,y在圆环内部。

②:问题:输入一个数n,输出n^2数阵,数阵为数字漩涡排列。
例:输入1,输出 1
输入2,
输出
1 2
3 4
输入3
输出
1 2 3
8 9 4
7 6 5
输入4
输出
1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7
是这个题么?
program hhs;
var
a,b,t,x:integer;
s:array[0..1000,0..1000]of integer;
begin
readln(x);
for a:=1 to 6 do begin
s[0,a]:=1;
s[x+1,a]:=1;
s[a,0]:=1;
s[a,x+1]:=1;
end;
t:=1;a:=1;b:=1;
while t<=x*x do begin
s[a,b]:=t;
if (s[a-1,b]<>0)and(s[a+1,b]=0)and(s[a,b+1]<>0)then a:=a+1
else
if (s[a,b-1]=0)and(s[a+1,b]<>0)and(s[a,b+1]<>0)then b:=b-1
else
if (s[a-1,b]=0)and(s[a+1,b]<>0)and(s[a,b-1]<>0)then a:=a-1
else b:=b+1;
t:=t+1
end;
for a:=1 to x do begin
for b:=1 to x do
write(s[a,b]:5);
writeln;
end;
end.

热点内容
和存储字长 发布:2025-05-15 21:54:09 浏览:514
用什么写c语言 发布:2025-05-15 21:35:56 浏览:418
linux读取u盘 发布:2025-05-15 21:32:13 浏览:508
c语言dos 发布:2025-05-15 21:18:17 浏览:664
sci编译英文 发布:2025-05-15 21:16:57 浏览:383
大猫如何设置密码 发布:2025-05-15 21:15:32 浏览:765
什么叫苹果版的和安卓版的手机 发布:2025-05-15 21:05:18 浏览:254
编程找点 发布:2025-05-15 20:43:10 浏览:588
php上传临时文件夹 发布:2025-05-15 20:43:00 浏览:658
impala数据库 发布:2025-05-15 20:42:12 浏览:650