算法导论 6-3(Young氏矩阵)

每天进步一点点!

#include <iostream>

using namespace std;
#define MAX 100
struct Y_Mat{
int m,n;
int row,sum;
int A[MAX][MAX];
};
void YONG_HEAPIFY(Y_Mat &ymat, int i, int j)
{
if(j>ymat.n)
return;
int key;
key = ymat.A[i][j];
while(i>1 && ymat.A[i-1][j] > key)
{
ymat.A[i][j] = ymat.A[i-1][j];
YONG_HEAPIFY(ymat,i,j);
i--;
}
while(j>1 && ymat.A[i][j-1] > key)
{
ymat.A[i][j] = ymat.A[i][j-1];
j--;
}
ymat.A[i][j] = key;
}
int EXTRACT_MIN(Y_Mat &ymat,int n, int m)
{
int min = ymat.A[1][1];
int key,i,j;
key = ymat.A[1][1] = MAX;
j = 1;
while(j<n && key > ymat.A[1][j+1])
{
ymat.A[1][j] = ymat.A[1][j+1];
j++;
}
i = 1;
while(i<m && key > ymat.A[i+1][j])
{
ymat.A[i][j] = ymat.A[i+1][j];
i++;
}
ymat.A[i][j] = key;
return min;
}
void INSERT(Y_Mat &ymat,int key)
{
if(ymat.sum >(ymat.m+ymat.n))
{
cout<<"Matrix full";
return;
}
int i,j;
i = ymat.row;
j = ymat.sum - i;
ymat.A[i][j] = key;
if(i == 1 && j < ymat.m )
{
ymat.row = j + 1;
ymat.sum++;
}
else if(i == 1)
{
ymat.row = ymat.m;
ymat.sum++;
}
else
ymat.row--;
YONG_HEAPIFY(ymat,i,j);
}
void BUILD_YONG_MATRIX(Y_Mat &ymat)
{
int i,j;
for(i= 1,j=1 ; ymat.sum<=ymat.m+ymat.n; i = ymat.row,j=ymat.sum - i)
INSERT(ymat,ymat.A[i][j]);
}
bool find(Y_Mat ymat, int key)
{
int i,j,k;
i = j = 1;
while(i<=ymat.m && j<= ymat.n)
{
if(key > ymat.A[i][j])
{
i++;j++;
}
else if(key < ymat.A[i][j])
{
for(k=j; k<=ymat.n; ++k)
{
if(i-1>0 && key == ymat.A[i-1][k])
return true;
else if(i-1<=0)
return false;
else if(key < ymat.A[i-1][k])
{
i--;k--;
}
}
for(k=i; k<=ymat.m; ++k)
{
if(j-1>0 && key == ymat.A[k][j-1])
return true;
else if(j-1<=0)
return false;
else if(key < ymat.A[k][j-1])
{
j--;k--;
}
}
}
else
return true;
}
}
void test()
{
Y_Mat ymat;
cin>>ymat.m>>ymat.n;
int i,j;
for(i = 1; i<= ymat.m; ++i)
for(j = 1; j<= ymat.n; ++j)
{
cin>>ymat.A[i][j];
}
ymat.sum = 2;
ymat.row = 1;
BUILD_YONG_MATRIX(ymat);
for(i = 1; i<=ymat.m; ++i)
{
for(j = 1; j<=ymat.n; ++j)
cout<<ymat.A[i][j]<<"  ";
cout<<endl;
}
while(cin>>i)
{
if(find(ymat,i))
cout<<"include"<<endl;
else
cout<<"not include"<<endl;
}
}
int main()
{
test();
return 0;
}


/*测式案例*/
/*
4 4
9 16 3 2
4 8 5 14
12 15 100 100
100 100 100 100
*/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值