编辑代码

#include <iostream>
#include <stdlib.h>
using namespace std;
typedef struct{
    //关系的矩阵表达式定义
    int* m;
    int size;
}matrix;
struct pos{
    //元素在矩阵中的坐标
    int x;
    int y;
    pos(){
        x = 0, y = 0;
    }
    pos(int x1, int y1){
        x = x1, y = y1;
    }
    void write_pos(int x1, int y1){
        x = x1, y = y1;
    }
};

void write_Mt(matrix& m, pos p, int val){
    //在矩阵m中找到位置为p的元素,并赋值val
    if (p.x<0||p.y<0||p.x>=m.size||p.y>=m.size){
        printf("in function 'write_Mt(matrix& m, pos p, int val)', p(%d,%d) is out its normal range.",p.x, p.y);
        exit(0);
    }
    val = (val >= 1) ? 1:0;
    *(m.m + p.x + p.y * m.size) = val;
}
int read_Mt(matrix& m, pos p){
    //在矩阵中找到位置为p的元素,并返回其值
    if (p.x<0||p.y<0||p.x>=m.size||p.y>=m.size){
        printf("in function 'read_Mt(matrix& m, pos p)', p(%d,%d) is out its normal range.",p.x,p.y);
        exit(0);
    }
    return *(m.m + p.x + p.y * m.size);
}
void print_Mt(matrix m)
{
    pos p;
    for (int i=0;i<m.size;i++)
    {
        for(int j=0;j<m.size;j++)
        {
            p.write_pos(i, j);
            printf("%d ", read_Mt(m, p));
        }
        printf("\n");
    }
    printf("\n");
}
void init_Mt(matrix& m, int len_m,  pos* p, int n)
{
    //初始化矩阵m
    //len_m为m大小,指针p代表已存在的关系,若p不为空指针,则n为其所指向元素个数
    m.size = len_m;
    m.m = (int*)malloc(sizeof(int) * (len_m * len_m));
    for (int i=0;i<m.size;i++){
        for (int j=0;j<m.size;j++){
            pos p1(i, j);
            write_Mt(m, p1, 0);
        }
    }
    if (p == nullptr || n == 0) return;
    for (int i=0;i<n;i++)
    {
        write_Mt(m, p[i], 1);
    }
}
void destroy_Mt(matrix& m){
    if (!m.m) {
        return;
    }
    free(m.m);
}
int add_Logic(int x1, int x2)
{
    //进行逻辑加运算
    x1 = (x1>=1)? 1:0;
    x2 = (x2>=1)? 1:0;
    if (x1==0&&x2==0) return 0;
    else return 1;
}
int multiply_Logic(int x1, int x2)
{
    //进行逻辑成乘运算
    x1 = (x1>=1)? 1:0;
    x2 = (x2>=1)? 1:0;
    return x1 * x2;
}
void copy_Mt(matrix m, matrix& res)
{
    if (m.size != res.size)
    {
        printf("in function 'copy_Mt(matrix m, matrix& res)', the sizes of these are not equal");
        exit(0);
    }
    for (int i=0;i<m.size*m.size;i++)
    {
        *(res.m + i) = *(m.m + i);
    }
}
void closure_relation(matrix m, matrix& res){
    //给出关系的矩阵表达式m,用res返回其传递闭包
    //复制m的值给res
    //使用Warshall算法求出传递闭包
    pos p, p1, p2;
    int mid1, mid2, mid3;
    copy_Mt(m, res);
    for(int k=0;k<m.size;k++){
        for (int i=0;i<m.size;i++){
            for (int j=0;j<m.size;j++){
                p.write_pos(j, i);
                p1.write_pos(j, k);
                p2.write_pos(k, i);
                mid1 = read_Mt(res, p);
                mid2 = read_Mt(res, p1);
                mid3 = read_Mt(res, p2);
                write_Mt(res, p, add_Logic(mid1, multiply_Logic(mid2, mid3)));
            }
        }
    }
}
void set_pos(pos* p, int n)
{
    //从输入端获取初始值为1的点的坐标,n表示p的个数
    printf("输入%d个坐标,用一个空格分开xy值,用回车区分坐标\n", n);
    for(int i=0;i<n;i++){
        scanf("%d %d",&p[i].x, &p[i].y);
    }
}
void multi_Mt(matrix& m1, matrix m2)
{
    if(m1.size != m2.size){
        printf("in func 'multi_Mt(matrix& m1, matrix m2)', m1.size != m2.size\n");
        return;
    }
    matrix m;
    pos p, p1, p2;
    init_Mt(m, m1.size, nullptr, 0);
    for(int i=0;i<m1.size;i++){
        for (int j=0;j<m1.size;j++){
            int mid = 0, mid1,mid2;
            p.write_pos(j, i);
            for (int k=0;k<m1.size;k++){
                p1.write_pos(k, i);
                p2.write_pos(j, k);
                mid1 = read_Mt(m1, p1);
                mid2 = read_Mt(m2, p2);
                mid = add_Logic(mid, multiply_Logic(mid1, mid2));
            }
            write_Mt(m, p, mid);
        }
    }
    copy_Mt(m1, m);
    destroy_Mt(m);
}
void selfMulti_Mt(matrix& m, int n)
{
    //求m的n次方
    matrix m1;
    init_Mt(m1, m.size, nullptr, 0);
    copy_Mt(m1, m);
    while (--n>0)
    {
        multi_Mt(m, m1);
    }
    destroy_Mt(m1);
}
int main() {
    //JSRUN引擎2.0,支持多达30种语言在线运行,全仿真在线交互输入输出。 
	cout << "Hello world!    - cpp.jsrun.net." << endl;
    /*matrix m ,m1;
    pos* p=(pos*)malloc(sizeof(pos)*6);
    set_pos(p, 6);
    init_Mt(m, 5, p, 6);
    init_Mt(m1, 5, nullptr, 0);
    print_Mt(m1);
    closure_relation(m,m1);
    print_Mt(m);
    print_Mt(m1);
    free(p);
    destroy_Mt(m);
    destroy_Mt(m1);*/
    matrix m,m1;
    pos* p=(pos*)malloc(sizeof(pos)*5);
    set_pos(p, 5);
    init_Mt(m, 6, p, 5);
    print_Mt(m);
    selfMulti_Mt(m, 2);
    print_Mt(m);
    destroy_Mt(m);
	return 0;
}