编程题:布尔积与逻辑短路(动态数组)
对于布尔(0-1)矩阵$$A=(a_{ij})_{m\times n}$$和$$B=(b_{ij})_{n\times p}$$,求$A$和$B$的布尔积$A\odot B=(c_{ij})_{m\times p}$,并返回逻辑与运算的执行次数。
布尔积运算定义如下:
$\qquad c_{ij}=\vee_{k=1}^{n}(a_{ik}\wedge b_{kj})$.
其中,$\vee$是逻辑或(||)操作,$\wedge$是逻辑与(&&)操作。
例如:
$$\left(
\begin{array}{ccc}
1&0&1\\
\textcolor{red}{0}&\textcolor{red}{1}&\textcolor{red}{1}\\
1&0&0
\end{array}\right)\odot \left(
\begin{array}{ccc}
1&0&\textcolor{lightgreen}{1}\\
0&1&\textcolor{lightgreen}{1}\\
1&0&\textcolor{lightgreen}{0}
\end{array}\right)=\left(
\begin{array}{ccc}
1&0&1\\
1&1&\large{\textcircled{\small{1}}}\\
1&0&1
\end{array}\right)
$$
其中,
$\qquad\large{\textcircled{\small{1}}}=\textcolor{red}{0}\&\&\textcolor{lightgreen}{1}||\textcolor{red}{1}\&\&\textcolor{lightgreen}{1}||\textcolor{red}{1}\&\&\textcolor{lightgreen}{0}$
考虑到逻辑运算的逻辑短路(惰性求值)现象,事实上,
$\qquad\large{\textcircled{\small{1}}}=\textcolor{red}{0}\&\&\textcolor{lightgreen}{1}||\textcolor{red}{1}\&\&\textcolor{lightgreen}{1}$
即只做了2次逻辑与操作。
### 输入格式:
第一行给出变量$m$, $n$和$p$的变量, 其中,$m,n,p\in Z^+$。
接下来的$m$行给出矩阵$A_{m\times n}$,每行包括$n$个布尔值(即0/1值),用空格隔开;
接下来的$n$行给出矩阵$B_{n\times p}$,每行包括$p$个布尔值(即0/1值),用空格隔开。
### 输出格式:
首先输出$m$行$p$列数据,即$A\odot B$的结果,列间使用一个空格隔开,最后一列后无空格;然后在下一行给出运算过程中逻辑与运算发生的次数。
### 输入样例:
in
3 3 3
1 0 1
0 1 1
1 0 0
1 0 1
0 1 1
1 0 0
### 输出样例:
out
1 0 1
1 1 1
1 0 1
17
### 提示:
由于本题中矩阵$A$和$B$的维数是由变量$m$, $n$和$p$确定的,而C语言在定义普通数组时,数组大小必须是整型常量,所以不能在程序中直接定义二维数组,需要用到动态数组。请参考如下代码段:
c++
#include <stdio.h>
#include <stdlib.h>
int main()
{
int m, n, p, i, j;
int **A, **B, **C;
scanf("%d%d%d", &m, &n, &p);
//生成动态数组A,B和C, 即为这3个二维数组分配内存,然后录入矩阵数据
A=(int**)calloc(m,sizeof(int*));
B=(int**)calloc(n,sizeof(int*));
C=(int**)calloc(m,sizeof(int*));
for(i=0;i<m;i++)
{
A[i]=(int*)calloc(n,sizeof(int));
for(j=0;j<n;j++)
scanf("%d", &A[i][j]);
}
for(i=0;i<n;i++)
{
B[i]=(int*)calloc(p,sizeof(int));
for(j=0;j<p;j++)
scanf("%d", &B[i][j]);
}
for(i=0;i<m;i++)
{
C[i]=(int*)calloc(p,sizeof(int));
}
/*-----------------------------------
矩阵录入数据已结束,以下是实现布尔积的代码部分,请注意:动态数组与普通数组的引用形式相同
该部分上面的代码和下面的代码你无需关注,不过变量声明部分可能需要增加新的变量
-----------------------------------*/
//动态数组用完后,所占内存不会自动释放,需要手动释放
for(i=0;i<m;i++)
free(A[i]);
free(A);
for(i=0;i<n;i++)
free(B[i]);
free(B);
for(i=0;i<m;i++)
free(C[i]);
free(C);
return 0;
}
answer:若无答案欢迎评论
布尔积运算定义如下:
$\qquad c_{ij}=\vee_{k=1}^{n}(a_{ik}\wedge b_{kj})$.
其中,$\vee$是逻辑或(||)操作,$\wedge$是逻辑与(&&)操作。
例如:
$$\left(
\begin{array}{ccc}
1&0&1\\
\textcolor{red}{0}&\textcolor{red}{1}&\textcolor{red}{1}\\
1&0&0
\end{array}\right)\odot \left(
\begin{array}{ccc}
1&0&\textcolor{lightgreen}{1}\\
0&1&\textcolor{lightgreen}{1}\\
1&0&\textcolor{lightgreen}{0}
\end{array}\right)=\left(
\begin{array}{ccc}
1&0&1\\
1&1&\large{\textcircled{\small{1}}}\\
1&0&1
\end{array}\right)
$$
其中,
$\qquad\large{\textcircled{\small{1}}}=\textcolor{red}{0}\&\&\textcolor{lightgreen}{1}||\textcolor{red}{1}\&\&\textcolor{lightgreen}{1}||\textcolor{red}{1}\&\&\textcolor{lightgreen}{0}$
考虑到逻辑运算的逻辑短路(惰性求值)现象,事实上,
$\qquad\large{\textcircled{\small{1}}}=\textcolor{red}{0}\&\&\textcolor{lightgreen}{1}||\textcolor{red}{1}\&\&\textcolor{lightgreen}{1}$
即只做了2次逻辑与操作。
### 输入格式:
第一行给出变量$m$, $n$和$p$的变量, 其中,$m,n,p\in Z^+$。
接下来的$m$行给出矩阵$A_{m\times n}$,每行包括$n$个布尔值(即0/1值),用空格隔开;
接下来的$n$行给出矩阵$B_{n\times p}$,每行包括$p$个布尔值(即0/1值),用空格隔开。
### 输出格式:
首先输出$m$行$p$列数据,即$A\odot B$的结果,列间使用一个空格隔开,最后一列后无空格;然后在下一行给出运算过程中逻辑与运算发生的次数。
### 输入样例:
in
3 3 3
1 0 1
0 1 1
1 0 0
1 0 1
0 1 1
1 0 0
### 输出样例:
out
1 0 1
1 1 1
1 0 1
17
### 提示:
由于本题中矩阵$A$和$B$的维数是由变量$m$, $n$和$p$确定的,而C语言在定义普通数组时,数组大小必须是整型常量,所以不能在程序中直接定义二维数组,需要用到动态数组。请参考如下代码段:
c++
#include <stdio.h>
#include <stdlib.h>
int main()
{
int m, n, p, i, j;
int **A, **B, **C;
scanf("%d%d%d", &m, &n, &p);
//生成动态数组A,B和C, 即为这3个二维数组分配内存,然后录入矩阵数据
A=(int**)calloc(m,sizeof(int*));
B=(int**)calloc(n,sizeof(int*));
C=(int**)calloc(m,sizeof(int*));
for(i=0;i<m;i++)
{
A[i]=(int*)calloc(n,sizeof(int));
for(j=0;j<n;j++)
scanf("%d", &A[i][j]);
}
for(i=0;i<n;i++)
{
B[i]=(int*)calloc(p,sizeof(int));
for(j=0;j<p;j++)
scanf("%d", &B[i][j]);
}
for(i=0;i<m;i++)
{
C[i]=(int*)calloc(p,sizeof(int));
}
/*-----------------------------------
矩阵录入数据已结束,以下是实现布尔积的代码部分,请注意:动态数组与普通数组的引用形式相同
该部分上面的代码和下面的代码你无需关注,不过变量声明部分可能需要增加新的变量
-----------------------------------*/
//动态数组用完后,所占内存不会自动释放,需要手动释放
for(i=0;i<m;i++)
free(A[i]);
free(A);
for(i=0;i<n;i++)
free(B[i]);
free(B);
for(i=0;i<m;i++)
free(C[i]);
free(C);
return 0;
}
answer:若无答案欢迎评论