菜鸟,求一段C#代码? 把1到81放到9*9的方格中,要求:所有的横行、竖行及最大的两个对角线上的数相加都等于同一个数 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 1)、当n为奇数时:采用连续斜行赋值法。首先把数1定在正中的下一格,数2定在1的斜行右下格,依此类推。即一般数i定在数i-1的斜行右下格(行数x列数y均增1)。直至当数i为n的倍数时,定在上一个数i-1格正下方的第2格(行数x增2,列数y不变)。按上述操作,格的位置(x,y)若超出n行n列的范围,按模n定位。即若出现x>n,则定在第x-n行;出现y>n,则定在第y-n列。 2)、当n为4的倍数时:采用对称元素交换法。首先把数n×n-1按行从上至下,奇数行从左至右,偶数行从右至左顺序填人方阵的n×n格。然后,把方阵的所有4×4子方阵中的两对角线上位置(即(i-j) mod 4=0||(i+j-1) mod 4=0,其中i为行号,j为列号)上的数固定下来不动;所有其它位置上的数关于方阵中心作对称交换,也就是把元素a(i,j)与元素a(n+1-i,n+1-j)的值交换。 3)、当n为非4倍数的偶数(即4m+2形)时:首先把大方阵分解为4个奇数(2m+1阶)子方阵。上述奇数阶魔方给分解的4个子方阵对应赋值,上左子方最小(i),下右子次小(i+v),下左子方最大(i+3v),上右子方次大(i+2v),即4个子方阵对应元素相差v,其中v=n*n/4,然后作相应的元素交换: a(i,j)与a(i+u,j)在同一列做对应交换(j<t或j>n-t+2) a(t,1)与a(t+u,1);a(t,t)与a(t+u,t)两对元素交换 其中u=n/2,t=(n+2)/4 上述交换使每行每列与两对角线上元素之和相等。 帖一个奇数阶的。#include <iostream.h> #include <conio.h> #include <stdio.h> void main() { int a[22][22],n,j,i,row,col,num; while(1) {cout<<"please entered an odd number from 0 to 20"<<endl; cout<<"an odd number is:";cin>>n; cout<<"you entered the number is :"<<n<<endl; if(n<0 || n>20 || (n%2)==0) cout<<"the nmumber is error!"<<endl; else break; } for(i=0;i<n+2;i++) for(j=0;j<n+2;j++) { a[i][j]=0; if(i==0 || j==0 ||i==n+1 ||j==n+1) a[i][j]=-1; } row=1;col=(n/2+1); for(num=1;num<=n*n;num++) {a[row][col]=num;i=row-1;j=col+1; if(a[i][j]!=-1) if(a[i][j]==0) {row=i;col=j;} else row=i+2; else {if(i==0&&j!=n+1) {row=n;col=j;} if(j==n+1&&i!=0) {row=i;col=1;} if(i==0&&j==n+1) row=i+2; } } for(i=1;i<n+1;i++) { for(j=1;j<n+1;j++) printf("%4d,",a[i][j]); cout<<endl; } } public static void sort(int n) //make sure "n" is odd number,like "9". { int[,] a = new int[n+2, n+2]; int i, j, row, col, num; for (i = 0; i < n + 2; i++) for (j = 0; j < n + 2; j++) { a[i, j] = 0; if (i == 0 || j == 0 || i == n + 1 || j == n + 1) a[i, j] = -1; } row = 1; col = (n / 2 + 1); for (num = 1; num <= n * n; num++) { a[row, col] = num; i = row - 1; j = col + 1; if (a[i, j] != -1) if (a[i, j] == 0) { row = i; col = j; } else row = i + 2; else { if (i == 0 && j != n + 1) { row = n; col = j; } if (j == n + 1 && i != 0) { row = i; col = 1; } if (i == 0 && j == n + 1) row = i + 2; } } for (i = 1; i < n + 1; i++) { for (j = 1; j < n + 1; j++) { Console.Write(a[i, j].ToString() + " "); } Console.Write("\r\n"); } Console.Read(); } //can runing in vs2005. 这个算法很麻烦的。一般人编这个恐怕要好久。你还是google一下吧。找到算法写代码就比较容易了。 VSTO Excel中如何查找到对应的值? wpf treeview 添加节点 【版务帖】2009年11月C#版务帖 DropDownList问题 SharpDevelop Vs VisualC# 大家说说智能客户端存在的不足有哪些??? 数据库联接问题 C# 如何实现将文件夹分卷压缩 在c#调用vb开发的ocx控件问题 DataSet数据写入的InsertCommand问题,请问错在哪里? 关于DagaGridView的菜鸟问题 一个正则表达式在本机可以运行,但传到服务器上就不行了,.net环境的版本是一样的。
2)、当n为4的倍数时:采用对称元素交换法。首先把数n×n-1按行从上至下,奇数行从左至右,偶数行从右至左顺序填人方阵的n×n格。然后,把方阵的所有4×4子方阵中的两对角线上位置(即(i-j) mod 4=0||(i+j-1) mod 4=0,其中i为行号,j为列号)上的数固定下来不动;所有其它位置上的数关于方阵中心作对称交换,也就是把元素a(i,j)与元素a(n+1-i,n+1-j)的值交换。
3)、当n为非4倍数的偶数(即4m+2形)时:首先把大方阵分解为4个奇数(2m+1阶)子方阵。上述奇数阶魔方给分解的4个子方阵对应赋值,上左子方最小(i),下右子次小(i+v),下左子方最大(i+3v),上右子方次大(i+2v),即4个子方阵对应元素相差v,其中v=n*n/4,然后作相应的元素交换:
a(i,j)与a(i+u,j)在同一列做对应交换(j<t或j>n-t+2)
a(t,1)与a(t+u,1);a(t,t)与a(t+u,t)两对元素交换
其中u=n/2,t=(n+2)/4
上述交换使每行每列与两对角线上元素之和相等。
#include <iostream.h>
#include <conio.h>
#include <stdio.h>
void main()
{ int a[22][22],n,j,i,row,col,num;
while(1)
{cout<<"please entered an odd number from 0 to 20"<<endl;
cout<<"an odd number is:";cin>>n;
cout<<"you entered the number is :"<<n<<endl;
if(n<0 || n>20 || (n%2)==0) cout<<"the nmumber is error!"<<endl;
else break;
}
for(i=0;i<n+2;i++)
for(j=0;j<n+2;j++)
{ a[i][j]=0;
if(i==0 || j==0 ||i==n+1 ||j==n+1) a[i][j]=-1;
}
row=1;col=(n/2+1);
for(num=1;num<=n*n;num++)
{a[row][col]=num;i=row-1;j=col+1;
if(a[i][j]!=-1)
if(a[i][j]==0) {row=i;col=j;}
else row=i+2;
else
{if(i==0&&j!=n+1) {row=n;col=j;}
if(j==n+1&&i!=0) {row=i;col=1;}
if(i==0&&j==n+1) row=i+2;
}
}
for(i=1;i<n+1;i++)
{ for(j=1;j<n+1;j++)
printf("%4d,",a[i][j]);
cout<<endl;
}
}
{
int[,] a = new int[n+2, n+2];
int i, j, row, col, num;
for (i = 0; i < n + 2; i++)
for (j = 0; j < n + 2; j++)
{
a[i, j] = 0;
if (i == 0 || j == 0 || i == n + 1 || j == n + 1)
a[i, j] = -1;
}
row = 1; col = (n / 2 + 1);
for (num = 1; num <= n * n; num++)
{
a[row, col] = num;
i = row - 1;
j = col + 1;
if (a[i, j] != -1)
if (a[i, j] == 0)
{
row = i; col = j;
}
else
row = i + 2;
else
{
if (i == 0 && j != n + 1) { row = n; col = j; }
if (j == n + 1 && i != 0) { row = i; col = 1; }
if (i == 0 && j == n + 1) row = i + 2;
}
}
for (i = 1; i < n + 1; i++)
{
for (j = 1; j < n + 1; j++)
{
Console.Write(a[i, j].ToString() + " ");
}
Console.Write("\r\n");
}
Console.Read();
}
//can runing in vs2005.