题目信息
输入
一次输入一个关系矩阵,每一行两个相邻元素之间用一个空格隔开,输入元素的行与列分别对应关系矩阵的行与列。关系的基数小于12。
输出
输出该关系的传递闭包所对应的关系矩阵。
友情提示:可以使用while (scanf("%d",&a)!=EOF)
测试样例
0 1 0 0
1 0 1 0
0 0 0 1
0 1 0 0
1 1 1 1
1 1 1 1
1 1 1 1
1 1 1 1
解答
#include <stdio.h>
#include <math.h>
int N;
int a[15][15];
void get_matrix()
{
int tmp[100];
int n = 0;
int num;
while (scanf("%d", &num) != EOF)
{
tmp[n++] = num;
}
N = (int) sqrt(n);
n = 0;
for (int i = 0; i < N; i++)
{
for (int j = 0; j < N; j++)
{
a[i][j] = tmp[n++];
}
}
}
void output_matrix()
{
for (int i = 0; i < N; i++)
{
for (int j = 0; j < N; j++)
{
printf("%d", a[i][j]);
if (j < N - 1)
{
printf(" ");
}
}
printf("\n");
}
}
/*
* (1)i=1
* (2)对所有j如果a[j,i]=1,则对k=0,1,…,n-1,a[j,k]=a[j,k]∨a[i,k]
* (3)i加1
* (4)如果i<n,则转到步骤2,否则停止
*/
void warshall()
{
for (int i = 0; i < N; i++)
{
for (int j = 0; j < N; j++)
{
if (a[j][i])
{
for (int k = 0; k < N; k++)
{
//逻辑加
a[j][k] = a[j][k] | a[i][k];
}
}
}
}
}
int main()
{
//freopen("/Users/zhj/Downloads/test.txt", "r", stdin);
get_matrix();
warshall();
output_matrix();
return 0;
}
想法
很经典的WarShall算法