程序 = 核心direct问题 + 子问题的关系、顺序

本文深入探讨了快速排序中partition操作与归并排序中merge操作的核心问题,阐述了如何通过解决这些基本操作来实现高效的数据排序。文章进一步分析了这类算法中核心问题之间的关系与顺序,为读者提供了一种系统性的思考方式。

比如快排,核心问题就是partition,然后就是一系列的partition问题的求解

merge sort,核心问题是merge一个数组的有序的前后两个部分,merge sort 就是一系列merge问题的求解。当然,是有一定顺序的。

这里所谓核心问题,就是直接的操作,可以直接的去解决的、不用再分为别的问题的问题。对应于递归函数里的非递归部分。

核心问题不会很复杂,partition和merge已经是很复杂的了。一般的问题都是很简单的核心直接问题 ,主要就是分析一系列这样的问题的关系、顺序的问题。参见todo list 工作列表算法。


#include <iostream> #include <stdio.h> using namespace std; int m, n; // 表示迷宫矩阵的行数,列数 int **maze; // 指向迷宫矩阵的指针 typedef struct node { int ipos,jpos; int direct[8]; struct node *next; }node_type; // 探索栈结点类型 typedef struct postp { int ipos,jpos; struct postp *next; }pos_type; // 路径栈结点类型 node_type *top; // 指向探索栈的栈顶指针 pos_type *pos_top; // 指向路径栈的栈顶指针 void init(int x0, int y0) // 初始化探索栈底,即入口坐标与其周围8个点状态 { top=new node_type; top->ipos=x0; top->jpos=y0; top->direct[0]=maze[x0-1][y0-1]; top->direct[1]=maze[x0-1][y0]; top->direct[2]=maze[x0-1][y0+1]; top->direct[3]=maze[x0][y0-1]; top->direct[4]=maze[x0][y0+1]; top->direct[5]=maze[x0+1][y0-1]; top->direct[6]=maze[x0+1][y0]; top->direct[7]=maze[x0+1][y0+1]; top->next=NULL; } void check_cycle(int ii, int jj, node_type *newp) // 检测新踏进点周围的某一点是否已在路径上 { node_type *p=top; while((p!=NULL)&&(!((p->ipos==ii)&&(p->jpos==jj)))) p=p->next; if(p!=NULL) switch(newp->ipos-ii) { case 1: switch(newp->jpos-jj) { case 1: newp->direct[0]=0; break; case 0: newp->direct[1]=0; break; case -1: newp->direct[2]=0; } break; case 0: switch(newp->jpos-jj) { case 1: newp->direct[3]=0; break; case -1: newp->direct[4]=0; } break; case -1: switch(newp->jpos-jj) { case 1: newp->direct[5]=0; break; case 0: newp->direct[6]=0; break; case -1: newp->direct[7]=0; } } } void push(int ii, int jj) // 探索中的一次踏进(入栈) { node_type *p; p=new node_type; p->ipos=ii; p->jpos=jj; p->direct[0]=maze[ii-1][jj-1]; p->direct[1]=maze[ii-1][jj]; p->direct[2]=maze[ii-1][jj+1]; p->direct[3]=maze[ii][jj-1]; p->direct[4]=maze[ii][jj+1]; p->direct[5]=maze[ii+1][jj-1]; p->direct[6]=maze[ii+1][jj]; p->direct[7]=maze[ii+1][jj+1]; if(p->direct[0]) check_cycle(ii-1,jj-1,p); if(p->direct[1]) check_cycle(ii-1,jj,p); if(p->direct[2]) check_cycle(ii-1,jj+1,p); if(p->direct[3]) check_cycle(ii,jj-1,p); if(p->direct[4]) check_cycle(ii,jj+1,p); if(p->direct[5]) check_cycle(ii+1,jj-1,p); if(p->direct[6]) check_cycle(ii+1,jj,p); if(p->direct[7]) check_cycle(ii+1,jj+1,p); p->next=top; top=p; } void pop() // 探索中的回退(一次出栈) { node_type *p; p=top; top=p->next; delete p; } void show_maze() // 显示迷宫矩阵 { int i,j; cout<<"A maze shown as below: \n"; for(i=0; i<m; i++) { cout<<" "; for(j=0; j<n; j++) cout<<maze[i][j]<<' '; cout<<endl; } } void show_pathway() // 回溯显示走出迷宫的路径 {//************************************************ //================================================ cout<<endl; } int main() { int i, j; freopen("exp02.in", "r", stdin); freopen("exp02.out", "w", stdout); cin>>m; cin>>n; maze=new int *[m]; for(i=0; i<m; i++) maze[i]=new int [n]; for(i=0; i<m; i++) for(j=0; j<n; j++) cin>>maze[i][j]; show_maze(); init(1,1); while((top!=NULL)&&(!((top->ipos==m-2)&&(top->jpos==n-2)))) { for(i=0; i<8; i++) if(top->direct[i]==1) { top->direct[i]=0; break; } switch(i) { case 0: push(top->ipos-1,top->jpos-1); break; case 1: push(top->ipos-1,top->jpos); break; case 2: push(top->ipos-1,top->jpos+1); break; case 3: push(top->ipos,top->jpos-1); break; case 4: push(top->ipos,top->jpos+1); break; case 5: push(top->ipos+1,top->jpos-1); break; case 6: push(top->ipos+1,top->jpos); break; case 7: push(top->ipos+1,top->jpos+1); break; default: pop(); } } if(top!=NULL) { cout<<"Pathway to get out off the maze: \n"; show_pathway(); } else cout<<"No pathway\n"; return 1; }
最新发布
11-06
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值