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; }
相关文章推荐
- html表格table实现鼠标移入移出行变色的一种可用方法
- 实现 Table 的行交替颜色、选中行变色的一种方法。演示+源码
- 实现 Table 的行交替颜色、选中行变色的一种方法。演示+源码
- iOS中类单例方法的一种实现
- 实数求根的一种快速实现方法
- Trafodion Rename Table不成功的另外一种解决方法
- IPv4_IPv6隧道技术的一种实现方法.pdf
- 一种实现 Java调用C++的DLL的方法
- 【转】ArrayList深拷贝的一种实现方法
- 一种实现mysql里自增序列的方法
- Asp.Net实现无限分类生成表格的方法(后台自定义输出table)
- C++封装SDK的一种方法(接口与实现分离)
- 求以下表达式的值,写出您想到的一种或几种实现方法: 1-2+3-4+……+m
- ECLIPSE插件获取到的有关“当前选择项”内容的一种典型实现方法
- 实现对gridview删除行时弹出确认对话框的一种简单方法
- 一种快速卷积实现方法
- 【web开发】基于注解spring的多方法请求的一种controller实现
- JavaScript实现将xml转换成html table表格的方法
- 一种分割与组合文件的方法-Java实现
- 质数判断程序实例:一种进度条实现原始方法[C源码]