新手请教!找错误!!!!!!!

konriuen 2004-08-20 02:51:49
要求打出魔方阵,如下:
17 24 1 8 15
23 5 7 14 16
4 6 13 20 22
10 12 19 21 3
11 18 25 2 9

我写的代码:
#include<stdio.h>
main(){
int a[4][4];
int i,j,k;
for(i=0;i<5;i++){
for(j=0;j<5;j++)
a[i][j]=0;
}
i=0;j=2;
a[i][j]=1;
for(k=2;k<26;k++){
if(i==0&&j!=4){
i=4;j=j+1;
}
else if(i!=0&&j!=4){
i=i-1;j=j+1;
}
else if(i!=0&&j==4){
i=i-1;j=0;
}
else if(i==0&&j==4){
i=i+1;
}
if(a[i][j]==0)
a[i][j]=k;
else if(a[i][j]!=0){
i=i+2;j=j-1;
a[i][j]=k;
}

}
printf("*********\n");
for(i=0;i<5;i++){
for(j=0;j<5;j++)
printf("%d ",a[i][j]);
printf("\n");
}

return(0);
}

得不到结果,请问哪里有问题?在线等,所有分给第一个给出正确提示的人
...全文
136 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
Asan13 2004-08-20
  • 打赏
  • 举报
回复
是算法问题!不单单空间不足。谭的那本上机指导有这个例子。其它一些介绍C的也有吧。
建议楼主看一下。
Asan13 2004-08-20
  • 打赏
  • 举报
回复
楼主对算法可能不是很清楚。
魔方阵的算法是,只要下一行和列不超出范围,下一个数等于当数的行减一,列加一。如果下一行和列都超出范围,行就等于当前行加二,列减一。如果只有下一行超出范围,列不超出,下一个数的行就等于最后一行。如果只有下一列超出范围,行不超出,下一个数的列就等于第一列。判断应该这样:(n是行数)
i = i - 1;
j = j + 1;
if (i == 0 && j == n + 1) {i = i + 2; j = j - 1;}
else if(i == 0) i = n;
else if(j == n + 1) j = 1;
先得出下一个数的行和列,然后判断。第一次除去行和列都不行的。剩下行不行或列不行或正常情况。第二次除去行不行的。剩下是一般情况和列不行的,第三次除去列不行的情况。
楼主的算法有问题。应该改成这样。
#include<stdio.h>
main(){
int a[5][5];
int i,j,k;
for(i=0;i<5;i++){
for(j=0;j<5;j++)
a[i][j]=0;
}
i=0;j=2;
a[i][j]=1;
for(k=2;k<26;k++){
if(i==0&&j==4){ /*这里判断了下一个数行和列是不是都不行*/
i=i+2;j=j-1;
}
else if(i==0){ /*下一个数行不行的情况*/
i=4;j=j+1;
}
else if(j==4){ /*下一个数列不行的情况*/
j=0;i=i-1;
}
else { /*剩下的就是正常的*/
i=i-1;j=j+1;
}
if(a[i][j]==0)
a[i][j]=k;
else if(a[i][j]!=0){
i=i+2;j=j-1;
a[i][j]=k;
}

}
printf("*********\n");
for(i=0;i<5;i++){
for(j=0;j<5;j++)
printf("%4d",a[i][j]);
printf("\n");
}

return(0);
}
konriuen 2004-08-20
  • 打赏
  • 举报
回复
确实是这样,我刚才也发现了,谢了!
zqpsswh 2004-08-20
  • 打赏
  • 举报
回复
楼主 你唯一的错误就是int a[4][4];这里

把两个4改成5就行
梁尚君 2004-08-20
  • 打赏
  • 举报
回复
不好意思,沒有仔細看你的代碼,我寫了一個,你看看和你的代碼不同的地方在哪裏?


#define N 5
#include "stdio.h"
main()
{
int i,j,k,a[N][N];
for(i=0;i<N;i++)
for(j=0;j<N;j++)
a[i][j]=0;
i=0;
j=N/2;
a[i][j]=1;
for(k=2;k<=N*N;k++)
{
i--;
j++;
if(i<0)
i=N-1;
if(j>=N)
j=0;
if(a[i][j]==0)
a[i][j]=k;
else
{
i=(i+2+N)%N;
j=(j-1+N)%N;
a[i][j]=k;
}
}
printf("\n\n");
for(i=0;i<N;i++)
{
printf("\t");
for(j=0;j<N;j++)
printf("%4d",a[i][j]);
printf("\n\n");
}
getch();
return;
}
konriuen 2004-08-20
  • 打赏
  • 举报
回复
看过你们的代码,我把源代码改了一下:
#include<stdio.h>
main(){
int a[4][4];
int i,j,k;
for(i=0;i<5;i++){
for(j=0;j<5;j++)
a[i][j]=0;
}
printf("%d\n",a[0][0]);
printf("%d\n",a[4][4]);
i=0;
j=2;
a[0][j]=1;
for(k=2;k<26;k++){
i=i-1;j=j+1;
if((i<0)&&(j>4)){
i=i+2;
j=j-1;
}
else{
if(i<0)i=4;
if(j>4)j=0;
}
if(a[i][j]==0)
a[i][j]=k;
else {
i=i+2;j=j-1;
a[i][j]=k;
}

}
printf("*********\n");
for(i=0;i<5;i++){
for(j=0;j<5;j++)
printf("%d ",a[i][j]);
printf("\n");
}

return(0);
}

但还是和刚才的代码结果一样,不是想要得结果,请问到底怎么回事?
算法是
1在第一行正中间。2行开始,每一个数比前一个数行数-1,列数+1。上一个数在第一行的话,下一个数在最后以行(5行),列数+1。上一个数在最后一列的话,下一个数列数为1,行数-1。如果预放位置上有数,就放在上一个数下方,第一行最后一列的下一个数放在它下方。
harvey93 2004-08-20
  • 打赏
  • 举报
回复
还有 因为不是狠了解你的算法 所以看不懂程序 可不可以把你的算法说一下?
harvey93 2004-08-20
  • 打赏
  • 举报
回复
楼主 你的程序数组方面有点问题,我想可能这就是原因 c语言里面声明一个数组他的索引是从0开始的也就是如果有int a[3];那么就有a[0],a[1],a[2]三个变量对于二维数组也是一样的 你把这个改了应该就行了
grooving 2004-08-20
  • 打赏
  • 举报
回复
只支持V为奇数。

V=5时:
17 24 1 8 15
23 5 7 14 16
4 6 13 20 22
10 12 19 21 3
11 18 25 2 9

V=7时:
30 39 48 1 10 19 28
38 47 7 9 18 27 29
46 6 8 17 26 35 37
5 14 16 25 34 36 45
13 15 24 33 42 44 4
21 23 32 41 43 3 12
22 31 40 49 2 11 20

V=11时:
68 81 94 107 120 1 14 27 40 53 66
80 93 106 119 11 13 26 39 52 65 67
92 105 118 10 12 25 38 51 64 77 79
104 117 9 22 24 37 50 63 76 78 91
116 8 21 23 36 49 62 75 88 90 103
7 20 33 35 48 61 74 87 89 102 115
19 32 34 47 60 73 86 99 101 114 6
31 44 46 59 72 85 98 100 113 5 18
43 45 58 71 84 97 110 112 4 17 30
55 57 70 83 96 109 111 3 16 29 42
56 69 82 95 108 121 2 15 28 41 54
grooving 2004-08-20
  • 打赏
  • 举报
回复
写了一个,支持n阶

#include <iostream>
#include <string>

#define V 11

int main()
{
int n,r,c;
int i,j;
int M[V][V];
c=0;
r=V/2 + V%2 - 1;
for(n=1;n<=V*V;n++)
{
M[c][r] = n;
if((n%V)==0)
{
c++;
continue;
}
c--;
r++;
if(c<0)
{
c = V-1;
}
if(r>(V-1))
{
r =0;
}
}

for(i=0;i<V;i++)
{
for(j=0;j<V;j++)
{
cout << M[i][j] << " ";
}
cout << endl;
}
cin.get();
}
qiuafa 2004-08-20
  • 打赏
  • 举报
回复
修改herryhuang(Herry) 成无限制大小

#include <vector>
#include <stdio>
using namespace std;

typedef vector<int> vi;

int printM(int m_c)
{
vector<vi> arr;
int x, y, i;

if(m_c < 3 || m_c % 2 == 0)
return -1;

x = (m_c - 1) / 2;
y = x + 1;

for (int m=1; m<=m_c; m++)
{
vi v;
for (int n=1; n<=m_c; n++)
{
v.push_back(n);
}
arr.push_back(v);
}

for(i = 1; i <= m_c * m_c; i++)
{
arr[x][y] = i;
if(i % m_c == 0)
{
y += 2;
}
else
{
y++;
x--;
}
if(y >= m_c) y -= m_c;
if(y < 0) y += m_c;
if(x >= m_c) x -= m_c;
if(x < 0) x += m_c;
}
for(y = 0; y < m_c; y++)
{
for(x = 0; x < m_c; x++)
printf("%5d ", arr[x][y]);
printf("\n");
}
return 0;
}

int main()
{
int i;
printf("? -");
scanf("%d", &i);
printM(i);
}
herryhuang 2004-08-20
  • 打赏
  • 举报
回复
上面程序的运行结果:


D:\Herry's Documents\study\test>test6
? -3
2 9 4
7 5 3
6 1 8

D:\Herry's Documents\study\test>test6
? -5
3 20 7 24 11
16 8 25 12 4
9 21 13 5 17
22 14 1 18 10
15 2 19 6 23

D:\Herry's Documents\study\test>test6
? -7
4 35 10 41 16 47 22
29 11 42 17 48 23 5
12 36 18 49 24 6 30
37 19 43 25 7 31 13
20 44 26 1 32 14 38
45 27 2 33 8 39 21
28 3 34 9 40 15 46

D:\Herry's Documents\study\test>test6
? -9
5 54 13 62 21 70 29 78 37
46 14 63 22 71 30 79 38 6
15 55 23 72 31 80 39 7 47
56 24 64 32 81 40 8 48 16
25 65 33 73 41 9 49 17 57
66 34 74 42 1 50 18 58 26
35 75 43 2 51 10 59 27 67
76 44 3 52 11 60 19 68 36
45 4 53 12 61 20 69 28 77

D:\Herry's Documents\study\test>test6
? -11
6 77 16 87 26 97 36 107 46 117 56
67 17 88 27 98 37 108 47 118 57 7
18 78 28 99 38 109 48 119 58 8 68
79 29 89 39 110 49 120 59 9 69 19
30 90 40 100 50 121 60 10 70 20 80
91 41 101 51 111 61 11 71 21 81 31
42 102 52 112 62 1 72 22 82 32 92
103 53 113 63 2 73 12 83 33 93 43
54 114 64 3 74 13 84 23 94 44 104
115 65 4 75 14 85 24 95 34 105 55
66 5 76 15 86 25 96 35 106 45 116
herryhuang 2004-08-20
  • 打赏
  • 举报
回复
没看懂你的程序,所以也不知道哪里有错,不过下面的程序可以打印任意奇数(2n+1)阶幻方(不叫魔方),因为内存的限制,我的程序限制在了3 - 101阶之内,你可以自己改。

#include <stdio.h>

#define MAX_M 101

int printM(int m_c)
{
int arr[MAX_M - 1][MAX_M - 1];
int x, y, i;

if(m_c < 3 || m_c > 101 || m_c % 2 == 0)
return -1;

x = (m_c - 1) / 2;
y = x + 1;

for(i = 1; i <= m_c * m_c; i++)
{
arr[x][y] = i;
if(i % m_c == 0)
{
y += 2;
}
else
{
y++;
x--;
}
if(y >= m_c) y -= m_c;
if(y < 0) y += m_c;
if(x >= m_c) x -= m_c;
if(x < 0) x += m_c;
}
for(y = 0; y < m_c; y++)
{
for(x = 0; x < m_c; x++)
printf("%5d ", arr[x][y]);
printf("\n");
}
return 0;
}

int main()
{
int i;
printf("? -");
scanf("%d", &i);
printM(i);
}

konriuen 2004-08-20
  • 打赏
  • 举报
回复
我顶
konriuen 2004-08-20
  • 打赏
  • 举报
回复
魔方阵就是行,列,对角相加都相等

33,321

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧