#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){
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){
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.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){
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)
{
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)
{
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() {
cout << "Hello world! - cpp.jsrun.net." << endl;
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;
}