矩阵

来源:互联网 发布:几个程序员去吃饭 编辑:程序博客网 时间:2024/06/05 04:14

给出一个矩阵,要求统计左上方的所有子矩阵中不同元素的个数。

#include<cstdio>#include<string.h>#include<iostream>#include<cmath>#include<cstdlib>#include<algorithm>using namespace std;const int maxn=1005;int A[maxn][maxn];int B[maxn][maxn];int R[maxn][maxn];int NC[maxn*maxn];int m,n;int C[maxn];int total;struct node{int row,col;}P[maxn*maxn];bool input(){int i,j;if(scanf("%d%d",&m,&n)==EOF)return 0;for(i=0;i<m;i++)for(j=0;j<n;j++)scanf("%d",&A[i][j]);return 1;}void output(int B[maxn][maxn]){int i,j;for(i=0;i<m;i++){printf("%d",B[i][0]);for(j=1;j<n;j++)printf(" %d",B[i][j]);printf("\n");}}bool cmp(node x,node y){return A[x.row][x.col]<B[y.row][y.col];}void solve(){int i,j,k=0;memset(C,0,sizeof(C));for(i=0;i<m;i++)for(j=0;j<n;j++)P[i].row=i,P[k++].col=j;sort(P,P+k,cmp);total=0;R[P[0].row][P[0].col]=total;for(i=1;i<k;i++){if(A[P[i].row][P[i].col]!=A[P[i-1].row][P[i-1].col])total++;R[P[i].row][P[i].col]=total;}for(i=0;i<=total;i++)NC[i]=n;for(i=0;i<m;i++){int sum=0;for(j=0;j<n;j++){if(j<NC[R[i][j]]){C[NC[R[i][j]]+1]--;NC[R[i][j]]=j;C[NC[R[i][j]]+1]++;}sum+=C[j+1];B[i][j]=sum;}}}int main(){while(input()){solve();output(B);}return 0;}


原创粉丝点击