您的位置:首页 > 其它

Young tableaus 的一种实现方法

2013-10-21 21:36 483 查看






























附上一种实现方法的源码:

#include <iostream>
#include <iomanip>
#include <stdlib.h>
#include <time.h>

using namespace std;

class young_tableaus
{
#define DEFAULT_VALUE -1

public:
young_tableaus(int m, int n):_m(m),_n(n),_i(-1),_j(n-1),_count(0),_max_count(m*n),_error(0)
{
int i,j;

_array = new int *[_m];
for(i=0; i<_m; i++)
_array[i] = new int[_n];
for(i=0;i<_m;i++)
for(j=0;j<n;j++)
_array[i][j] = DEFAULT_VALUE;
}
~young_tableaus(void)
{
int i;
for(i=0; i<_m; i++)
delete [] _array[i];
delete [] _array;
}

int error(void)
{
return _error;
}

void insert(int x)
{
if(_count==_max_count){
cout << "error: table full" << endl;
return;
}

_j++;
if(_j==_n){
_i++;
_j=0;
}

if(_array[_i][_j]!=DEFAULT_VALUE){
cout << "error: init value(" << _array[_i][_j] << ")!= DEFAULT_VALUE" << endl;
if(_j>0)
_j--;
else{
_j = _n-1;
_i--;
}
return;
}

_count++;
_array[_i][_j] = x;
cout << "insert " << x << endl;

route_in();
}

int extract(void)
{
if(_count==0){
cout << "error: table empty" << endl;
return -1;
}

int x = _array[0][0];
int last;

if(_j>0){
last = _array[_i][_j];
_array[0][0] = last;
_array[_i][_j] = DEFAULT_VALUE;
_j--;
_count--;
}
else{//_j=0
if(_i>0){
last = _array[_i][_j];
_array[0][0] = last;
_array[_i][_j] = DEFAULT_VALUE;
_i--;
_j = _n-1;
_count--;
}
else{//_i=0
_array[_i][_j] = DEFAULT_VALUE;
_i--;
_j = _n-1;
_count = 0;
cout << "extract " << x << endl;
return x;
}
}

route_out();

cout << "extract " << x << endl;
return x;
}

int search(int x, int *m, int *n)
{
int j,b,find=0;

if(_count==0){
cout << "table empty" << endl;
return -1;
}

for(j=0;j<=_j;j++){//find first col with _array[i][j]>x
b = _array[_i][j];
if(x==b){
find = 1;
*m = _i;
*n = j;
break;
}
if(x<b)
break;
}

if(find==1)
return 0;
else{
if(j<=_j){//find col
find = route_x(x,_i,j,m,n);
if(find)
return 0;
}

if(_i==0)
find = 0;
else{
for(j=_j+1;j<=_n-1;j++){
b = _array[_i-1][j];
if(x==b){
find = 1;
*m = _i;
*n = _j;
break;
}
if(x<b)
break;
}
if(find==1)
return 0;
else{
if(j<=_n-1)
find = route_x(x,_i-1,j,m,n);
else
find = 0;
}
}

}
if(find==1)
return 0;
else
return -1;
}

void print(void)
{
int i,j;
cout << "total elem " << _count << endl;
for(i=0;i<_m;i++){
for(j=0;j<_n;j++)
cout << setw(2) << _array[i][j] << " ";
cout << endl;
}
cout << endl;
}

private:
int _m;
int _n;
int _i;
int _j;
int _count;
int _max_count;
int _error;
int **_array;

void swap(int *a, int *b)
{
int tmp;

tmp = *a;
*a = *b;
*b = tmp;
}

int route_x(int x, int i, int j, int *m, int *n)
{
int a,b;

while(1){
if(i!=0){
a = _array[i-1][j];
if(x==a){
*m = i-1;
*n = j;
return 1;
}
else if(x<a)
i--;
else{
i--;
repeat:
if(j<_n-1){
b = _array[i][j+1];
if(x==b){
*m = i;
*n = j+1;
return 1;
}
else if(x>b){
j++;
goto repeat;
}
else{
j++;
}
}
else
return 0;
}
}
else
return 0;
}
}

void route_in(void)
{
int i = _i;
int j = _j;
int a,b,x;

while((i!=0)||(j!=0)){
x = _array[i][j];
if(i!=0){
a = _array[i-1][j];
if(j==0){
if(x<a){
swap(&_array[i-1][j],&_array[i][j]);
i--;
}
else
break;
}
else{
b = _array[i][j-1];
if((x>=a)&&(x>=b))
break;
else if((x>=a)&&(x<b)){
swap(&_array[i][j-1],&_array[i][j]);
j--;
}
else if((x>=b)&&(x<a)){
swap(&_array[i-1][j],&_array[i][j]);
i--;
}
4000

else if(a>b){
swap(&_array[i-1][j],&_array[i][j]);
i--;
}
else{
swap(&_array[i][j-1],&_array[i][j]);
j--;
}
}
}
else{
b = _array[i][j-1];
if(x<b){
swap(&_array[i][j-1],&_array[i][j]);
j--;
}
else
break;
}
}
check();
}

void route_out(void)
{
int i = 0;
int j = 0;
int a,b,x;

while(1){
x = _array[i][j];
if((i<_i-1)||((i<_i)&&(j<=_j))){
a = _array[i+1][j];
if(j==_n-1){//last col of row i
if(x>a){
swap(&_array[i+1][j],&_array[i][j]);
i++;
}
else
break;
}
else{
b = _array[i][j+1];
if((x<=a)&&(x<=b))
break;
else if((x>a)&&(x<=b)){
swap(&_array[i+1][j],&_array[i][j]);
i++;
}
else if((x>b)&&(x<=a)){
swap(&_array[i][j+1],&_array[i][j]);
j++;
}
else if(a>b){
swap(&_array[i][j+1],&_array[i][j]);
j++;
}
else{
swap(&_array[i+1][j],&_array[i][j]);
i++;
}
}
}
else if(i<_i){//i<_i,j>_j
if(j==_n-1)
break;
b = _array[i][j+1];
if(x>b){
swap(&_array[i][j+1],&_array[i][j]);
j++;
}
else
break;

}
else{//i==_i,last row
if(j<=_j-1){
b = _array[i][j+1];
if(x>b){
swap(&_array[i][j+1],&_array[i][j]);
j++;
}
else
break;
}
else
break;
}
}
check();
}

void check(void)
{
int i,j;

for(i=0;i<_m;i++)
for(j=0;j<_n-1;j++)
if((_array[i][j]>_array[i][j+1])&&(_array[i][j+1]!=DEFAULT_VALUE)){
_error++;
cout << i << "," << j << "," << _array[i][j] << "," << _array[i][j+1] << endl;
}
for(j=0;j<_n;j++)
for(i=0;i<_m-1;i++)
if((_array[i][j]>_array[i+1][j])&&(_array[i+1][j]!=DEFAULT_VALUE)){
_error++;
cout << i << "," << j << "," << _array[i][j] << "," << _array[i+1][j] << endl;
}
}

};

#define M 4
#define N 6
#define ARRAY_SIZE 22
#define MAX_NUM (100)
#define RAND32 (rand() + (rand()<<16))

void gen_input(int *array,int size)
{
int i;

srand((unsigned) time(NULL));

for(i=0;i<size;i++)
array[i] = RAND32 % MAX_NUM;
}

int main(void)
{
young_tableaus yt(M,N);
int *array,i=-1,j=-1,k,result,x;

array = new int[ARRAY_SIZE];
gen_input(array,ARRAY_SIZE);

for(k=0;k<ARRAY_SIZE;k++){
yt.insert(array[k]);
if(yt.error()){
yt.print();
break;
}
}

yt.print();

for(k=0;k<ARRAY_SIZE;k++){
x = array[k];
result = yt.search(x,&i,&j);
if(!result)
cout << "find " << setw(2) << x << " @(" << setw(2) << i << "," << setw(2) << j << ")" << endl;
else
cout << "can not find " << x << endl;
}
/*
for(k=0;k<ARRAY_SIZE;k++){
yt.extract();
if(yt.error()){
yt.print();
break;
}
}
yt.print();
*/
delete [] array;

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息