程序是这样的:
#include "stdio.h"
#include "Malloc.h"
void rR(int **w1,int n1);
void sR(int **w2,int n2);
void tR(int **w3,int n3);
void printjuzhen(int **w,int nh,int ml);
main() /*在这输入动态数组的值并保存3份m1,m2,m3*/
{ int i,j,n;
int **m1,**m2,**m3;
printf("Input n:");
scanf("%d",&n);
m1=(int*)malloc(n*n*2);
m2=(int*)malloc(n*n*2);
m3=(int*)malloc(n*n*2);
printf("Input juzhen:\n");
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{ scanf("%d",&m1[i][j]);
m2[i][j]=m1[i][j];
m3[i][j]=m1[i][j];
}
rR(m1,n);
sR(m2,n);
tR(m3,n);
getch();
}
void rR(int **w1,int n1) /*求输入的关系方阵的自反比包(原方阵+同阶数的单位方阵(就是对角线为1其余为0))*/
{
int i,j;
int **Ix;
Ix=(int*)malloc(n1*n1*2);
for(i=0;i<n1;i++)
for(j=0;j<n1;j++)
{ if(i==j) Ix[i][j]=1;
else Ix[i][j]=0;
}
for(i=0;i<n1;i++)
for(j=0;j<n1;j++)
w1[i][j]=w1[i][j]+Ix[i][j];
printf("r(R):\n");
printjuzhen(w1,n1,n1);
}
void sR(int **w2,int n2) /*求对称必包就是原方阵+原方阵的转置方阵*/
{
int i,j;
int **Rc;
Rc=(int*)malloc(n2*n2*2);
for(i=0;i<n2;i++)
for(j=0;j<n2;j++)
Rc[i][j]=w2[j][i];
for(i=0;i<n2;i++)
for(j=0;j<n2;j++)
w2[i][j]=w2[i][j]+Rc[i][j];
printf("s(R):\n");
printjuzhen(w2,n2,n2);
}
void tR(int **w3,int n3) /*求对传递必包具体是用warshall方法*/
{ int i,j,k;
for(j=0;j<n3;j++)
for(i=0;i<n3;i++)
{if(w3[i][j]>=1)
for(k=0;k<n3;k++)
{w3[i][k]=w3[i][k]+w3[j][k];
}
}
printf("t(R):\n");
printjuzhen(w3,n3,n3);
}
void printjuzhen(int **w,int nh,int ml)
{ int i,j;
for(i=0;i<nh;i++)
for(j=0;j<ml;j++)
{ if(w[i][j]>=2) w[i][j]=1; 这句为后来加上的
printf("%d ",w[i][j]);
if(j==(ml-1)) printf("\n");
}
}
PS:方阵的加法为逻辑加既1+1=1,0+0=0,大于1的相加也为1
我的问题是为什么在不加红的那句输出的话为正确答案(但没有把>=1的置为1),
而加了红的后就错了呢?既不是只是把>=1的变成1
如输入4
0 1 0 0
1 0 1 0
0 0 0 1
0 0 0 0
时最后一个方阵为
t(R):
1 2 1 1
2 2 2 1
0 0 0 1
0 0 0 0
但加了红的那句后就成了
1 1 1 1
1 1 1 1
1 1 1 1
1 1 1 1
这是为什么?太奇怪我只是在输出时让 >=2的变为1罢了
大家帮忙看看吧