算法导论 思考题 6-3 c,d,e小题

来源:互联网 发布:图布局算法 编辑:程序博客网 时间:2024/05/16 08:21
#include <stdio.h>#include <limits.h>#define LEN 4int YExtractMin(int a[LEN][LEN]){int r=a[0][0];a[0][0]=INT_MAX;int i=0,j=0,temp;bool flag=false;while(i+1<LEN || j+1<LEN){flag=false;if(i+1<LEN && j+1<LEN){if(a[i+1][j]<a[i][j] && a[i+1][j]<a[i][j+1]){temp=a[i+1][j];a[i+1][j]=a[i][j];a[i][j]=temp;i=i+1;flag=true;}if(a[i][j+1]<a[i][j] && a[i][j+1]<a[i+1][j]){temp=a[i][j+1];a[i][j+1]=a[i][j];a[i][j]=temp;j=j+1;flag=true;}}else{if(i+1<LEN){if(a[i+1][j]<a[i][j]){temp=a[i+1][j];a[i+1][j]=a[i][j];a[i][j]=temp;i=i+1;flag=true;}}else{if(a[i][j+1]<a[i][j]){temp=a[i][j+1];a[i][j+1]=a[i][j];a[i][j]=temp;j=j+1;flag=true;}}}if(!flag){break;}}return r;}void decreaseKey(int a[LEN][LEN],int key,int i,int j){if(key>a[i][j]){printf("新键必须小于原键!");return;}a[i][j]=key;bool flag=false;int temp;while(i-1>=0 || j-1>=0){flag=false;if(i-1>=0 && j-1>=0){if(a[i-1][j]>a[i][j] || a[i][j-1]>a[i][j]){if(a[i-1][j]>a[i][j-1]){temp=a[i][j];a[i][j]=a[i-1][j];a[i-1][j]=temp;i--;flag=true;}else{temp=a[i][j];a[i][j]=a[i][j-1];a[i][j-1]=temp;j--;flag=true;}}}else if(i-1>=0){if(a[i-1][j]>a[i][j]){temp=a[i][j];a[i][j]=a[i-1][j];a[i-1][j]=temp;i--;flag=true;}}else{if(a[i][j-1]>a[i][j]){temp=a[i][j];a[i][j]=a[i][j-1];a[i][j-1]=temp;j--;flag=true;}}if(!flag){break;}}}void printA(int a[LEN][LEN]){for(int i=0;i<LEN;i++){for(int j=0;j<LEN;j++){if(a[i][j]<INT_MAX)printf("%d ",a[i][j]);elseprintf("* ");}printf("\n");}}void Yinsert(int a[LEN][LEN],int key){decreaseKey(a,key,LEN-1,LEN-1);}void Ysort(int a[LEN][LEN]){int t;do{t=YExtractMin(a);if(t!=INT_MAX)printf("%d ",t);}while(t!=INT_MAX);}bool YfindKey(int a[LEN][LEN],int key){int t=YExtractMin(a);while( t != INT_MAX){if(t==key)return true;if(t>key){return false;}t=YExtractMin(a);}}void main(){int a[LEN][LEN]={{2,3,4,5},{8,9,12,14},{16,INT_MAX,INT_MAX,INT_MAX},{INT_MAX,INT_MAX,INT_MAX,INT_MAX}};//YExtractMin(a);//decreaseKey(a,1,1,3);Yinsert(a,1);printA(a);//Ysort(a);bool b=YfindKey(a,5);printf("%d",b);getchar();}

0 0