青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

2020年12月24日

10年初搭建的原始的AOSP工程。不知道官網(wǎng)現(xiàn)在還能不能下載到。從內(nèi)核到開發(fā)調(diào)試工具的所有東西都可以編譯出來,包括:內(nèi)核、虛擬機(jī)、Framework、Java應(yīng)用、手機(jī)模擬器、log工具、調(diào)試工具、開發(fā)用的Eclipse插件、SDK、、NDK等。
鏈接:
https://gitee.com/zhulf753/repo/tree/master/Android/Ubuntu10.04
Drop here!
posted @ 2020-12-24 12:34 zlf 閱讀(338) | 評(píng)論 (0)編輯 收藏

2018年6月23日

     摘要: 經(jīng)過別人在板子上幾天幾夜的測(cè)試,跑了6、7個(gè)任務(wù)同時(shí)開了4、5個(gè)中斷,CPU滿負(fù)荷。完全沒問題,已經(jīng)用在產(chǎn)品上。主要就修改一個(gè)文件os_cpu_a.asm和任務(wù)創(chuàng)建時(shí)堆棧初始化代碼。花了兩天時(shí)間(以前沒接觸過cortex-m0也沒寫過匯編,多年沒接觸過單片機(jī)了)。以下是os_cpu_a.asm。有不少的草稿代碼,應(yīng)該不影響閱讀的,請(qǐng)自行忽略。;***************************...  閱讀全文
posted @ 2018-06-23 10:41 zlf 閱讀(1035) | 評(píng)論 (0)編輯 收藏

2016年11月1日

     摘要: 相關(guān)標(biāo)準(zhǔn)描述參考網(wǎng)站:http://www.fourcc.org/ 參考解析工具和圖片參考網(wǎng)站:http://www.sunrayimage.com/examples.html 網(wǎng)上有很多解析YUV格式的工具,覺得還是sunrayimage的工具比較全還有示例圖片。 只有代碼,花半天時(shí)間折騰出來的。 Code highlighting produced by Actipro CodeHig...  閱讀全文
posted @ 2016-11-01 18:01 zlf 閱讀(2138) | 評(píng)論 (0)編輯 收藏

2008年1月11日

#include<iostream>
#include<deque>
#include <ctime>
using namespace std;
template<class _Ty, class _C = deque<_Ty> >
class zlfStack {
public:
 typedef unsigned _Ty;
 typedef _C::allocator_type allocator_type;
 typedef _C::value_type value_type;
 typedef _C::size_type size_type;
 typedef _C::iterator zlfIterator;
protected:
 _C c;
public:
inline
 const value_type& zlfTop2(){
  return *(c.end()-2);
 }
inline
 const value_type& zlfTop3(){
  return *(c.end()-3);
 }
inline
 void top_3(value_type& x,value_type& y,value_type& b)
 {
  b=*(c.end()-1);
  y=*(c.end()-2);
  x=*(c.end()-3);
 }
inline
void top_2(value_type& x,value_type& y)
{
 y=*(c.end()-2);
 x=*(c.end()-3);
}

 //zlfStack(){ }
 explicit zlfStack(const allocator_type& _Al = allocator_type())
  :c(_Al){}
 allocator_type get_allocator() const
 {return (c.get_allocator()); }
 bool empty() const
 {return (c.empty()); }
 size_type size() const
 {return (c.size()); }
 value_type& top()
 {return (c.back()); }
 const value_type& top() const
 {return (c.back()); }
 void push(const value_type& _X)
 {c.push_back(_X); }
inline
 void push_3(const value_type& x,const value_type& y,const value_type& b)
 {
  c.push_back(x);
  c.push_back(y);
  c.push_back(b);
 }
inline
 void pop()
 {c.pop_back(); }
 };///
enum{B0=0,B1=1,B2=2,B3=3};
int A(unsigned x,unsigned y)
{
 static count=0; 
 if (!x&&!y) {return ++count;return count;}
 if (x==0xffff) {count=0;return 0;}
 if (x) A(--x,y);
AB1: if(y) A(x,--y);
AB2:
  return count;
  
}
inline
void clear(){A(0xffff,0);}
zlfStack<unsigned> s;
inline
void push(unsigned x,unsigned y,unsigned b)
{
 s.push(x);
 s.push(y);
 s.push(b);
}
inline
void pop(unsigned& x,unsigned& y,unsigned& b)
{
 b=s.top();
 s.pop();
// y=s.top();
 s.pop();
// x=s.top();
 s.pop();
}


int main()
{
 unsigned x=1,y=1,b=1,c=0,z=0;
 unsigned temp=0;
 clock_t t1,t2;
 unsigned k=1;
 unsigned long sum1=0,sum2=0,time1=0,time2=0;

 cout<<"AAAA"<<endl;
 t1=clock();
 for (x=1;x<10;x++) {
  for (y=1;y<10;y++) { 
   clear();
   k=A(x,y);
   sum1+=k;
   cout<<k<<" ";
   cout<<"x="<<x<<" "<<"y="<<y<<endl;
  }
 }
 t2=clock();
 time1=t2-t1;
 cout<<endl;


 if (!x&&!y) return 0;//exit
 sum2 = 0;
 t1=clock();
 for (x=1;x<10;x++) { 
  for (y=1;y<10;y++) {// push(x,y,B3);
  s.push_3(x,y,B3);
  c=0;
  b=B0;
  while (!s.empty()) {
   switch(b) {
   case B0:if(x) {//push(--x,y,B1);
    s.push_3(--x,y,B1);
    b=B0;continue;}
   case B1:if(y) {//push(x,--y,B2);
    s.push_3(x,--y,B2);
    b=B0;continue;}
   case B2:if (!x&&!y) c++;
   default:;
   }//switch
  // pop(x,y,b);
   b=s.top();
   s.pop();
   s.pop(); 
   s.pop();
   if(b==B3) break;//return to main
  // pop(x,y,temp);
  // push(x,y,temp);
  // y=s.zlfTop2();
  // x=s.zlfTop3();
   s.top_2(x,y);
  }//while
  sum2+=c;
 // cout<<"c="<<c<<" "<<"x="<<x<<" "<<"y="<<y<<endl;
  }//y
 }//x
 t2=clock();
 time2=t2-t1;
 cout<<"time used :"<<time2<<"ms"<<endl;
 cout<<"routines :"<<sum2<<endl;
 cout<<endl<<endl;
 double t;
 cout<<"routines: "<<sum1<<"  time1: "<<time1<<endl;
 t=sum1/time1;
 cout<<t<<" rps"<<endl;
 cout<<"routines: "<<sum2<<"  time2: "<<time2<<endl;
 t=sum2/time2;
 cout<<t<<" rps"<<endl;
 return 0;
}

posted @ 2008-01-11 17:15 zlf 閱讀(657) | 評(píng)論 (0)編輯 收藏

2008年1月10日

用http的get方法,構(gòu)造要查詢的url,get下來,分析結(jié)果頁面即可
首先是構(gòu)造url,以下是一些示例,主要看清楚?號(hào)后面的參數(shù)所代表的意思即可:
http://www.google.cn/search?num=100&&q=%E5%85%83%E6%90%9C%E7%B4%A2&start=10

http://www.baidu.com/s?wd=%D4%AA%CB%D1%CB%F7&rn=100&pn=10  //第二頁pn

http://www.yahoo.cn/s?p=%E5%85%83%E6%90%9C%E7%B4%A2&b=10  //第二頁b

http://search.yahoo.com/search?n=100&p=%E5%85%83%E6%90%9C%E7%B4%A2&b=101

http://cnweb.search.live.com/results.aspx?q=%E5%85%83%E6%90%9C%E7%B4%A2&first=51  //第二頁first=51

http://p.zhongsou.com/p?w=%D4%AA%CB%D1%CB%F7&b=3  //b=3表示第三頁

http://www.soso.com/q?w=%D4%AA%CB%D1%CB%F7&num=20&pg=1 //第一頁,每頁20個(gè)

第二步是解釋搜索結(jié)果頁面:

<meta http-equiv="content-type" content="text/html;charset=gb2312">

Google
搜索結(jié)果個(gè)數(shù)的字符串前綴:約有<b> //獲取個(gè)數(shù)用字符串定位的方式
搜索結(jié)果開始的標(biāo)簽:<div id=res> //也可以用字符串定位的方式,要準(zhǔn)確就用查找標(biāo)簽定位的方式
 各個(gè)搜索結(jié)果的開始標(biāo)簽:<div class=g> //字符串定位的方式
 
  搜索結(jié)果的url在第一個(gè)<a target=_blank class=l>標(biāo)簽里頭
  搜索結(jié)果的標(biāo)題在<a></a>的標(biāo)簽之間

  搜索結(jié)果的摘要在接下來的<table><tr><td>標(biāo)簽里頭直到<b>...<b><br>
  搜索結(jié)果的重寫的url在<b>...<b><br>之后的<span>標(biāo)簽里頭,格式為:url,一個(gè)空格,網(wǎng)頁大小
  搜索結(jié)果的網(wǎng)頁快照在接下來的<a class=fl>的標(biāo)簽里頭,屬性中有url,標(biāo)簽之間有網(wǎng)頁快照文字
  接下來還有類似網(wǎng)頁等,都在<a class=fl>標(biāo)簽里頭

 各個(gè)搜索結(jié)果的結(jié)束標(biāo)簽是</td></tr></table></div>

......................

相關(guān)搜索的開始標(biāo)簽:<p class=e>
在接下來的各個(gè)<a></a>標(biāo)簽之間的內(nèi)容就是相關(guān)搜索的內(nèi)容
直到標(biāo)簽<br clear=all>就可以結(jié)束了

 

Baidu
搜索結(jié)果個(gè)數(shù)的字符串前綴:<td align=\"righ,在定位該字符串后,直到</td>,即在這個(gè)td標(biāo)簽之內(nèi)含有的字符串包含相關(guān)網(wǎng)頁數(shù)和用時(shí)
搜索結(jié)果開始的標(biāo)簽:<DIV id=ScriptDiv></DIV>
 各個(gè)搜索結(jié)果的開始標(biāo)簽:<table

  搜索結(jié)果的url在第一個(gè)<a target=_blank class=l>標(biāo)簽里頭
  搜索結(jié)果的標(biāo)題在<a></a>的標(biāo)簽之間,以<br>標(biāo)簽結(jié)束
  
  搜索結(jié)果的摘要以<br>開始直到下一個(gè)<br>標(biāo)簽
  
  接下來的一行(<br>換行)的font標(biāo)簽中有搜索結(jié)果url的重寫,一個(gè)空格,網(wǎng)頁大小,網(wǎng)頁時(shí)間
  在接下來會(huì)有一些<a>標(biāo)簽如百度快照,直到又一個(gè)<br>

 然后搜索結(jié)果的結(jié)束標(biāo)簽</table>

.........................

導(dǎo)航條的開始標(biāo)簽:<br clear=all>
導(dǎo)航條的內(nèi)容在開始標(biāo)簽之后的<div class="p"></div>標(biāo)簽之間
相關(guān)搜索在接下來的<div>標(biāo)簽之間的各個(gè)<a>標(biāo)簽之內(nèi)

其他考慮:對(duì)于字符串的匹配可以利用kmp,注意到匹配搜索結(jié)果各部分的時(shí)候所用到的模式字符串的最大前綴字符串最多是一個(gè)字符,這樣可以避免求取最大前綴字符串從而提高效率;如果要精確地匹配還需要弄兩個(gè)函數(shù),一個(gè)用來構(gòu)造標(biāo)簽,一個(gè)用來讀取標(biāo)簽之間的文本。

posted @ 2008-01-10 20:50 zlf 閱讀(1928) | 評(píng)論 (1)編輯 收藏

2007年10月8日

序列化探討

主要就是解釋readobject和writeobject函數(shù),應(yīng)該夠了,至于在DOC/VIEW模型種使用的話,應(yīng)該很簡(jiǎn)單的


0---
空指針   7FFF---大索引號(hào)標(biāo)志,即后面的索引號(hào)是32位的

0X8000---保留以后使用   0XFFFF---新類的定義

小索引對(duì)象或者類的索引號(hào):1~~~7FFE,但是類的最高位是1

對(duì)象的插入:writeobject函數(shù):(全局插入<<函數(shù)只是調(diào)用了這個(gè)函數(shù))首先插入類信息,然后是對(duì)象信息。每次寫入(即一次writeobject函數(shù)的執(zhí)行流程)是下面三種的之一:

1           若是未寫過的類并且未被寫過的對(duì)象:

1.1 寫入新類標(biāo)志:0XFFFF       *this << wNewClassTag;

1.2 寫入類的版本號(hào),寫入類名的字符串長度:ar << (WORD)m_wSchema << nLen;

1.3 寫入類名 ar.Write(m_lpszClassName, nLen*sizeof(char));

1.4 寫入對(duì)象              ((CObject*)pOb)->Serialize(*this);

2           若是曾經(jīng)寫過的類并且未寫過的對(duì)象:

2.1 寫入類的索引號(hào) nClassIndex = (DWORD)(*m_pStoreMap)[(void*)pClassRef]

如果是小索引類:則寫入類*this << (WORD)(wClassTag | nClassIndex);

 如果是大索引類:則寫入大索引號(hào)標(biāo)志(7FFF)和32位的類索引號(hào)(最高位是1                     *this << wBigObjectTag;

                     *this << (dwBigClassTag | nClassIndex);

2.2   寫入對(duì)象              ((CObject*)pOb)->Serialize(*this);

3           若是曾經(jīng)寫過的類并且曾經(jīng)寫過的對(duì)象:

3.1 寫入對(duì)象的索引號(hào)

        如果是小索引對(duì)象:則直接寫入索引號(hào)*this << (WORD)nObIndex;

        如果是大索引對(duì)象:則寫入大索引號(hào)標(biāo)志和32位的對(duì)象索引號(hào)(最高位是0

                     *this << wBigObjectTag;

                     *this << nObIndex;

以上3種情況的寫入都是首先寫入一個(gè)字,這個(gè)字的內(nèi)容就代表了之后字節(jié)即類信息的意義或者可以只是一個(gè)對(duì)象的索引號(hào)(情況三),即是新類(字節(jié)為0xFFFF)還是已經(jīng)定過的小索引類(索引號(hào)從0x8001—0xFFFE)又或者是已經(jīng)定義過的大索引類以(字節(jié)0x7FFF后續(xù)兩個(gè)字節(jié)為索引號(hào))。

 

對(duì)于讀取上面文件格式的信息并且區(qū)分出將要讀取的是類還是對(duì)象,是索引還是對(duì)象數(shù)據(jù),在readObject

首先讀取一個(gè)字如果0XFFFF則顯然對(duì)應(yīng)的是第一種情況,此時(shí)可以容易地讀取數(shù)據(jù);如果第一個(gè)字的最高位是1的話,很顯然此時(shí)對(duì)應(yīng)的就是第二種情況,即該字是一個(gè)類的索引號(hào),而且是小索引類;如果0x7FFF則此時(shí)對(duì)應(yīng)的就是第三種情況大索引號(hào)對(duì)象或者第二種情況大索引號(hào)類;如果最高位不是1則此時(shí)對(duì)應(yīng)的也是第三種情況但是小索引對(duì)象;在區(qū)分了第一個(gè)字以后就可以容易地讀取后面的數(shù)據(jù)。這樣每次的readObject函數(shù)的調(diào)用都只是提取以往某次writeObject函數(shù)寫入的數(shù)據(jù)。

 

對(duì)象的提取:ReadObject函數(shù),因?yàn)樵诤?/span>IMPLEMENT_SERIAL里定義的提取操作符只是簡(jiǎn)單地調(diào)用了這個(gè)函數(shù)。首先提取類信息,以便正確地動(dòng)態(tài)生成對(duì)象,然后是對(duì)象信息。

PS:m_pStoreMap里即包含了已經(jīng)序列化的類(CRuntimeClass)和對(duì)象的指針。

 

UINT CArchive::GetObjectSchema()函數(shù)只能調(diào)用一次,一般該函數(shù)在某個(gè)類(ar正在序列化的類)的Serialize函數(shù)里頭調(diào)用,它返回讀取的類的版本號(hào)。以下幾行來自readObject:

              UINT nSchemaSave = m_nObjectSchema;

              m_nObjectSchema = nSchema;

              pOb->Serialize(*this);

              m_nObjectSchema = nSchemaSave;

一般地,也正是在serialize里頭來處理各種版本的序列化。

FAQ:

1. 為什么可以定義全局的插入操作符,而提取操作符卻要對(duì)每個(gè)類在宏里頭聲明?

插入操作的是在已知對(duì)象所有信息的情況下的操作,包括對(duì)象的類型和狀態(tài),類信息的寫入使用CruntimeClass非靜態(tài)成員函數(shù)Store來實(shí)現(xiàn)的,而GetCRuntime成員函數(shù)又是虛函數(shù)所以可以用指向COBJECT的指針來正確地獲取,然后正確地調(diào)用STORE函數(shù);而對(duì)于提取操作,將要提取出的對(duì)象的類型和狀態(tài)都是未知,提取類信息主要是用CruntimeClass靜態(tài)成員LOAD來獲取,該成員獲得文件中類信息之后通過查找全局的類型鏈表可以唯一地確定一個(gè)CrutimeClass類型的靜態(tài)對(duì)象,通過該對(duì)象的createObject函數(shù)可以構(gòu)造出即將提取的對(duì)象類型,然后利用動(dòng)態(tài)構(gòu)造的對(duì)象的序列化函數(shù)就可以正確地提取出對(duì)象,因?yàn)?/span>

11       在宏定義的提取操作符中classname參數(shù)是無法用COBJECT類來替換,因?yàn)槿绻鎿Q的話則在提取信息過程中即使出現(xiàn)錯(cuò)誤,比如說提取出的類型根本就不是可序列化的但是如果繼承自COBJECT的話仍然可以通過錯(cuò)誤檢查。

posted @ 2007-10-08 11:00 zlf 閱讀(1639) | 評(píng)論 (1)編輯 收藏

2007年10月5日

#include <math.h>
#include <vector>
using namespace std;
#define max(a,b)  ((a)>(b)?(a):(b))
template<typename E>
class AVL_TMP

 template <typename E>
 class AVL_NODE
 {
 public:
  AVL_NODE():ln(0),rn(0),depth(0){}
  AVL_NODE( const E& e):data(e),ln(0),rn(0),depth(0){}
  ~AVL_NODE(){ if (ln) delete ln; if (rn) delete rn; }

  bool operator < (E& e){  return data < e; }
  bool operator > (E& e){  return data > e; }
  bool operator == (E& e){ return data == e; }
  bool operator != (E& e){ return data != e; }

  E getdata(){return data;}
  
  E data;
  int depth;
  AVL_NODE<E> *ln,*rn;
 };
 
public: 
 typedef E dataType;
 typedef AVL_TMP<E> Myt;
 typedef AVL_NODE<E> n;
 typedef n* npos;
 typedef npos iterator;
 enum unbalanceType {LL,RR,LR,RL};
 AVL_TMP():root(0),size(0),depth(-1){}
 ~AVL_TMP(){ if(root) delete root; }

 iterator begin(){return root;}
 bool insert(const E& e);
 npos find(const E& e);
 npos findpre(const E& e);
 bool del(dataType);
 bool balance(AVL_TMP<E>::iterator pos){
  if(pos == NULL) throw 0;
  int lh,rh;
  if(pos->ln == NULL ) lh = -1;
  else lh = pos->ln->depth;
  if(pos->rn == NULL ) rh = -1;
  else rh = pos->rn->depth;
  return abs( lh - rh ) < 2 ;
 }
 virtual void frontOrder(){};
 virtual void midOrder(){ };

protected:
 void LLr(AVL_TMP<E>::iterator pos,AVL_TMP<E>::iterator prePos);
 void LRr(AVL_TMP<E>::iterator pos,AVL_TMP<E>::iterator prePos);
 void RRr(AVL_TMP<E>::iterator pos,AVL_TMP<E>::iterator prePos);
 void RLr(AVL_TMP<E>::iterator pos,AVL_TMP<E>::iterator prePos);
 void updateDepth(AVL_TMP<E>::iterator pos);
 bool delAux(E const& e,AVL_TMP<E>::iterator pos = NULL);
 iterator findMax(iterator );
 iterator findMin(iterator );
 bool upTree(int iDepth,iterator itRoot,unsigned long iSize){depth = iDepth;root = itRoot;size = iSize; return true;}
 bool upRoutineDepth(vector<iterator>&);
 bool adjust(iterator a,iterator b,iterator c,iterator prePos = NULL);
 npos root;
 int depth;
 unsigned long size;
};
template<typename E>
bool AVL_TMP<E>::adjust(iterator a,iterator b,iterator c,iterator prePos){
 bool b1,b2;
 b1 = b == a->ln;
 b2 = c == b->ln;
 unbalanceType ub;
 if(b1&&!b2)   ub = LR;
 if(!b1&&b2)   ub = RL;
 if(b1&&b2)    ub = LL;
 if(!b1&&!b2)  ub = RR;
 switch(ub) {
  case  LL :LLr(a,prePos);
   break;
  case  LR :LRr(a, prePos);
   break;
  case  RR :RRr(a,prePos);
   break;
  case  RL :RLr(a,prePos);
   break;
 }  //end switch
 return true;
}
template<typename E>
bool AVL_TMP<E>::upRoutineDepth(vector<iterator>&routine){
 //該函數(shù)主要是將路徑節(jié)點(diǎn)的深度更新并且使得那些不平衡的節(jié)點(diǎn)平衡
 int size = routine.size();
 while (size--) {
  updateDepth(routine[size]);
  if (!balance(routine[size])) {//不平衡得調(diào)整
   iterator cur = routine[size],prePos = NULL;
   if(size-1>=0)
    prePos = routine[size-1];
   //檢查當(dāng)前不平衡節(jié)點(diǎn)的哪顆子樹的高度更高
   bool bl = cur->ln != NULL;
   bool br = cur->rn != NULL;
   if (!bl) {//肯定有右孩子
    if(cur->rn->ln) RLr(cur,prePos);
    else RRr(cur,prePos);
   }
   else{//有左孩子
    if (!br) {//沒右孩子
     if (cur->ln->ln) LLr(cur,prePos);
     else LRr(cur,prePos);
    }
    else{ //有右孩子,此時(shí)需要檢查左右孩子的高度,則右子樹高度至少為1
     //因此左子樹高度至少為3,則左子樹的節(jié)點(diǎn)個(gè)數(shù)肯定大于4
     if (cur->ln->depth > cur->rn->depth) LLr(cur,prePos);
     else RRr(cur,prePos);
    }
   }
  }
 }
 return true;
}
template<typename E>
AVL_TMP<E>::iterator AVL_TMP<E>::findMax(AVL_TMP<E>::iterator pos){//以pos為根的樹的最大值的節(jié)點(diǎn)
 if (!pos) return NULL;
 iterator p = pos;
 while(p->rn) p = p->rn;
 return p;
}
template<typename E>
AVL_TMP<E>::iterator AVL_TMP<E>::findMin(AVL_TMP<E>::iterator pos){
 iterator p = pos;
 while (p->ln) p = p->ln;
 return p;
}
template<typename E>
void AVL_TMP<E>::updateDepth(AVL_TMP<E>::iterator pos){
 bool b1 = pos->ln == NULL,b2 = pos->rn ==NULL;
 switch(b1) {
 case true:
  if(b2) pos->depth = 0;
  else pos->depth = pos->rn->depth+1;
  break;
 default: //false
  if(b2)  pos->depth = pos->ln->depth+1;
  else pos->depth = max(pos->ln->depth , pos->rn->depth )+1;
 }
 if(pos == root) depth = pos->depth;
}
template<typename E>
void AVL_TMP<E>::LLr(AVL_TMP<E>::iterator pos,AVL_TMP<E>::iterator prePos){
 typename AVL_TMP<E>::iterator t, a = pos, b = t = pos->ln ;
 pos->ln = t->rn;
 t->rn = pos;
 if(root == a) root = b;
 if(prePos != NULL)
  if(prePos->ln == a) prePos->ln = b;
  else prePos->rn =  b;
 updateDepth(a);updateDepth(b);
}
template<typename E>
void AVL_TMP<E>::LRr(AVL_TMP<E>::iterator pos,AVL_TMP<E>::iterator prePos){
 AVL_TMP<E>::iterator a = pos,b = pos ->ln, c = b->rn;
 b->rn = c->ln ; a->ln = c->rn;
 c->ln = b;  c->rn =a;
 if(a == root ) root = c ;
 if(prePos != NULL)
  if(prePos->ln == a) prePos->ln = c;
  else prePos->rn =  c;
 updateDepth(a);updateDepth(b);updateDepth(c);
}
template<typename E>
void AVL_TMP<E>::RRr(AVL_TMP<E>::iterator pos,AVL_TMP<E>::iterator prePos ){
 AVL_TMP<E>::iterator a = pos ,t, b = t = pos->rn ;
 pos->rn = t->ln;
 t->ln = pos;
 if(prePos != NULL)
  if(prePos->ln == a) prePos->ln = b;
  else prePos->rn =  b;
 if(root == a) root = b;
 updateDepth(a);updateDepth(b);
}
template<typename E>
void AVL_TMP<E>::RLr(AVL_TMP<E>::iterator pos,AVL_TMP<E>::iterator prePos){
 AVL_TMP<E>::iterator a = pos, b = pos->rn , c = b->ln;
 a->rn = c->ln ;  b->ln = c->rn;
 c->ln = a; c->rn = b;
 if(prePos != NULL)
  if(prePos->ln == a) prePos->ln = c;
  else prePos->rn =  c;
 if( a == root) root = c;
 updateDepth(a);updateDepth(b);updateDepth(c);
}
template<typename E>
bool AVL_TMP<E>::insert(const E& e){
 if(root == NULL) {root = new AVL_NODE<E>(e); size++; depth = root->depth;return true;}
 bool bUpdateDepth = false;
 vector<AVL_TMP<E>::iterator> routin;
 typename AVL_TMP<E>::iterator p = root,pos,prePos;
 for (int i = 0 ; i < size ;i++ ) {
  routin.push_back(p);
  if(p->data > e){
   if ( p->ln == NULL ) {
    p->ln = pos = new AVL_NODE<E>(e);
    bUpdateDepth = p->rn == NULL;
    break;
   }
   else { p = p->ln ; continue;}
  }
  if(p->data  < e){
   if (p->rn == NULL) {
    p->rn = pos = new AVL_NODE<E>(e) ;
    bUpdateDepth = p->ln == NULL;
    break;
   }
   else {  p = p->rn ; continue;}
  }
  return false;   //already exists
 }  //insertion finished
 size++;
 if(size <= 2 ) {
  updateDepth(root);
  return true;
 }
 if(!bUpdateDepth) return true;   //balance
 
 bool unAdjusted = true;
 // check for balance and adjust depth
 for (i = routin.size()-1; i  >=0 ; i-- ) {
  if(!balance(routin.at(i)))
   if(unAdjusted) {  //  unbalance! get unbalance type
    if(i-1 >= 0) prePos = routin.at(i-1);
    else prePos = NULL;
    AVL_TMP<E>::iterator a = routin.at(i) , b = routin.at(i+1) , c;
    if(i+2 >= routin.size() ) c = pos;
    else c = routin.at(i+2);
    bool b1,b2;
    b1 = b == a->ln;
    b2 = c == b->ln;
    unbalanceType ub;
    if(b1&&!b2)   ub = LR;
    if(!b1&&b2)   ub = RL;
    if(b1&&b2)    ub = LL;
    if(!b1&&!b2)  ub = RR;

    switch(ub) {
     case  LL :LLr(routin.at(i),prePos);
      break;
     case  LR :LRr(routin.at(i),prePos);
      break;
     case  RR :RRr(routin.at(i),prePos);
      break;
     case  RL :RLr(routin.at(i),prePos);
      break;
    }  //end switch
    unAdjusted = false;
   }  //end if
 updateDepth(routin.at(i));  //update the depth of the node in the routin
 depth = root->depth;
 }//end for
 return true;
};
template<typename E>
AVL_TMP<E>::npos AVL_TMP<E>::find(const E& e){//search for position
   npos p=root;
   while (p&&p->data!=e)
    if(e>p->data) p=p->rn;
    else p= p->ln;
   return p;
}
template<typename E>
AVL_TMP<E>::npos AVL_TMP<E>::findpre(const E& e){//search for parent node position
   npos p,pre;
   p=pre=root;
   while (p&&p->data!=e) {
    pre = p;
    if (e>p->data) p=p->rn;
    else p = p->ln;
   }
   if(p) if(p->data==e) return NULL;//already existed
   return pre;
}
template<typename E>
bool AVL_TMP<E>::delAux(E const& e,AVL_TMP<E>::iterator pos){
 // 1.遞歸刪除節(jié)點(diǎn),直到刪除的是葉子節(jié)點(diǎn) 
 // 2. 刪除葉子節(jié)點(diǎn),更新樹的數(shù)據(jù)成員
 // 3. 更新路徑上的節(jié)點(diǎn)深度并且檢查平衡因子 
 static vector<iterator> routine;
 iterator p = pos;
 bool bUpdate = false;
 if(!pos){//第一次調(diào)用
  p = root;
  while (p&&e!=p->data) {//找到節(jié)點(diǎn),并且將尋找路徑存入表中
   routine.push_back(p);
   if(p->data > e) p = p->ln;
   else p = p->rn;
  }
  if(p == NULL){ //沒找到
   routine.clear(); 
   return false;
  }
  else pos = p;
 }
 if (pos->ln||pos->rn) {//不是葉子節(jié)點(diǎn),則該節(jié)點(diǎn)有孩子節(jié)點(diǎn),可能是一個(gè)或者兩個(gè)
  routine.push_back(pos);//還得往下刪除
  if (pos->ln&&!pos->rn){ //情況一: 只有有左孩子
   //找到左子樹中的最大值的位置
   iterator max = pos->ln;
   while (max->rn) { routine.push_back(max); max = max->rn;}
   bUpdate = false;
   //偽刪除
   pos->data = max->data;
   delAux(max->data,max);
  }
  else if (!pos->ln&&pos->rn) { //情況二:只有右孩子
   //找到右子樹中的最小值
   iterator min = pos->rn;
   while (min->ln) { routine.push_back(min); min = min->ln;}
   bUpdate = false;
   //偽刪除
   pos->data = min->data;
   delAux(min->data,min);
  }
  else //情況三:有倆個(gè)孩子
  {
   //找到左子樹中的最大值
   iterator max = pos->ln;
   while (max->rn) { routine.push_back(max); max = max->rn;}
   bUpdate = false;
   //偽刪除
   pos->data = max->data;
   delAux(max->data,max);
  }
 }
 else
 {//是葉子節(jié)點(diǎn)
  //有三種情況,是其父節(jié)點(diǎn)的左子樹且沒有兄弟,是其父節(jié)點(diǎn)的右子樹且沒有兄弟,有兄弟
  //取得其父節(jié)點(diǎn)
  iterator parent = NULL;
  if (routine.size()) //有父節(jié)點(diǎn)
   parent = routine[routine.size()-1];
  else{//即該節(jié)點(diǎn)是根節(jié)點(diǎn),無根節(jié)點(diǎn)
   delete root;
   routine.clear();
   upTree(-1,NULL,0);
   return true;
  }  //完成根節(jié)點(diǎn)的刪除
  //有父節(jié)點(diǎn)
  if (pos == parent->ln&&!parent->rn) {//情況一:是父節(jié)點(diǎn)的左孩子且沒兄弟
   //刪除節(jié)點(diǎn)
   parent->ln = NULL;
   delete pos;
   //需要更新路徑上的節(jié)點(diǎn)的深度
   bUpdate = true;
   upRoutineDepth(routine);
   upTree(root->depth,root,size-1);
   routine.clear();
   //改寫父節(jié)點(diǎn)的孩子指針
  }//完成情況一葉子節(jié)點(diǎn)的刪除
  else{
   if (pos == parent->rn && !parent->ln ) { //情況二:是父節(jié)點(diǎn)的右孩子且沒兄弟
    parent->rn = NULL;
    delete pos; 
    bUpdate = true;
    upRoutineDepth(routine);
    upTree(root->depth,root,size-1);
    routine.clear();
   }//完成情況二葉子節(jié)點(diǎn)的刪除
   else{//情況三:有兄弟
    //只需要將節(jié)點(diǎn)刪除,并清理路徑表就可以了
    if (pos == parent->ln) parent->ln = NULL;
    else parent->rn = NULL;
    delete pos;
    routine.clear();
   }//完成情況三的葉子節(jié)點(diǎn)刪除
  }
 }
 return true;
}

template<typename E>
bool AVL_TMP<E>::del(dataType e){
 return delAux(e);
}

posted @ 2007-10-05 15:47 zlf 閱讀(2601) | 評(píng)論 (2)編輯 收藏

2007年9月14日

#include <iostream.h>
#include<io.h>
const int QUENS = 7;
int getcol(int q[],int n,const int firstCol)
{//q表示每個(gè)皇后的列位置,firstCol是搜索列位置時(shí)的起始位置
//n表示正在搜索第n個(gè)皇后的列位置,皇后的名稱從0--n編號(hào),也是皇后的行號(hào)
 bool b = true;
 int i = firstCol;
 for (i = firstCol; i<=QUENS ; i++) {
  for (int j=0; j<n; j++) {
   if(q[j] == i || (n+q[j]==i+j)||(n+i == j+q[j])){
    b = false;
    break;
   }
  }
  if(j == n)
    return i;
  else if(firstCol > QUENS) return firstCol;
 }
 if(!b) return QUENS+1;
}
void EQ(int q[],int n){
 void disp(int[]);
 int col = QUENS+1;
 bool b = true;
 int firstCol = 0;
 while (QUENS >= (col=getcol(q,n,firstCol))){
  if(QUENS == n){
   q[n] = col;
   disp(q);
   return ;
  }
  else{
   q[n] = col;
   firstCol = col +1;
   EQ(q,n+1);
  }
 }
 
}
void disp(int q[])
{//顯示一種排列
 static count = 0;
 count++;
 cout<<"number "<<count<<" : ";
 for (int i=0; i<=QUENS; i++)
  cout<<q[i]+1<<" ";
 cout<<endl;
}
void outTofile()
{//由于結(jié)果比較多,所以把結(jié)果重定向輸出到文件里頭了,文件名是EightQuen.txt
 int old = _dup(1);
 FILE* pf;
 pf = fopen("EightQuen.txt","w");
 if(!pf)  throw 0;
 _dup2((fileno(pf)),_fileno(stdout));
 int q[8];
 EQ(q,0);
fclose(pf);
 _dup2(old,_fileno(stdout));

}
void main()
{
outTofile();
}

posted @ 2007-09-14 14:41 zlf 閱讀(619) | 評(píng)論 (0)編輯 收藏
僅列出標(biāo)題  

導(dǎo)航

<2025年11月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
30123456

統(tǒng)計(jì)

常用鏈接

留言簿(1)

隨筆檔案

文章檔案

搜索

最新評(píng)論

閱讀排行榜

評(píng)論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美片第1页综合| 久久综合色影院| 久久亚洲午夜电影| 久久人人爽人人爽| **性色生活片久久毛片| 欧美成人精品在线| 欧美剧在线观看| 久久国产一区| 欧美成人亚洲| 久久精品国产免费看久久精品| 久久精品国产成人| 亚洲欧美日本另类| 亚洲第一精品福利| 在线亚洲免费| 亚洲第一区中文99精品| 亚洲视频在线观看一区| 亚洲国产精品国自产拍av秋霞| 一区二区三区欧美激情| 亚洲国产精品va在线观看黑人| 亚洲图片在线观看| 亚洲日本久久| 久久久久国产精品人| 亚洲综合精品| 欧美激情第一页xxx| 欧美在线视频网站| 欧美日韩精品久久| 欧美成人免费va影院高清| 国产精品久久久久77777| 亚洲国产第一页| 国产精品成人一区二区三区吃奶| 欧美激情1区2区| 黄色av日韩| 欧美一区亚洲| 午夜视频在线观看一区| 欧美三级电影大全| 亚洲欧洲视频在线| 在线日本高清免费不卡| 欧美亚洲视频在线看网址| 亚洲一区二区视频在线| 欧美精品一区二区精品网| 免费成人av在线看| 激情综合电影网| 午夜视频精品| 欧美在线亚洲综合一区| 国产精品久久久久999| 一区二区三区日韩在线观看| 夜夜夜精品看看| 欧美黄色大片网站| 亚洲第一中文字幕| 亚洲国产中文字幕在线观看| 久久精品理论片| 久久噜噜亚洲综合| 国产在线精品二区| 欧美伊人久久久久久久久影院| 久久五月天婷婷| 亚洲成人在线观看视频| 免费成人美女女| 欧美黄色一区| 99精品欧美一区二区三区| 欧美高清在线| 99综合电影在线视频| 亚洲一区二区三区四区在线观看 | 久久精品91久久久久久再现| 欧美一区二区高清| 国产午夜亚洲精品不卡| 久久精品国产第一区二区三区| 久久在线视频在线| 国语自产精品视频在线看一大j8 | 一区二区三区偷拍| 欧美理论电影在线观看| 一本色道久久综合狠狠躁篇的优点 | 欧美一区高清| 先锋影音国产一区| 国产日韩免费| 久久久噜噜噜久久中文字幕色伊伊| 美女黄色成人网| 亚洲三级毛片| 国产精品高潮呻吟视频| 久久成人人人人精品欧| 欧美高清在线视频观看不卡| 99re这里只有精品6| 国产精品乱人伦一区二区| 羞羞视频在线观看欧美| 乱中年女人伦av一区二区| 亚洲精品小视频在线观看| 欧美日韩国产小视频| 亚洲一区久久| 欧美承认网站| 亚洲欧美变态国产另类| 国产无一区二区| 免费成人av在线看| 亚洲无玛一区| 欧美高清视频一区二区三区在线观看| 一本色道久久综合亚洲精品高清| 国产老女人精品毛片久久| 玖玖国产精品视频| 中文av字幕一区| 欧美不卡三区| 亚洲欧美中日韩| 91久久综合亚洲鲁鲁五月天| 国产精品乱子久久久久| 欧美电影电视剧在线观看| 亚洲无限乱码一二三四麻| 欧美777四色影视在线| 午夜在线观看免费一区| 亚洲人成在线免费观看| 国产原创一区二区| 欧美日韩免费观看一区=区三区| 一区二区冒白浆视频| 久久日韩粉嫩一区二区三区| 一区二区成人精品 | 亚洲欧美在线x视频| 亚洲激情第一页| 国语精品一区| 国产精品国产精品国产专区不蜜| 看欧美日韩国产| 一区二区三区日韩精品视频| 另类专区欧美制服同性| 小处雏高清一区二区三区| av成人黄色| 在线观看成人av| 国产欧美精品| 欧美午夜美女看片| 欧美福利视频| 久久亚洲美女| 欧美综合国产精品久久丁香| 亚洲老司机av| 欧美va亚洲va国产综合| 亚洲一区激情| 亚洲福利免费| 狠狠色综合一区二区| 国产欧美亚洲日本| 国产欧美 在线欧美| 欧美日韩一区综合| 欧美大成色www永久网站婷| 亚洲欧美视频一区二区三区| 99视频精品全部免费在线| 亚洲大胆女人| 欧美中文字幕在线视频| 亚洲视频欧美视频| 精久久久久久| 亚洲电影网站| 在线欧美日韩国产| 亚洲图片激情小说| 欧美在线不卡视频| 国产精品久久久久久久久动漫| 亚洲综合色在线| 久久精品国产一区二区电影| 狠狠爱成人网| 国产精品嫩草影院一区二区 | 亚洲电影在线| 欧美一区二区在线看| 亚洲欧洲日韩在线| 国产欧美日韩一区二区三区在线观看| 亚洲一二三区在线| 欧美福利电影网| 欧美一区二区国产| 亚洲国产一区在线观看| 欧美久久久久免费| 欧美伊人久久| 91久久综合| 新片速递亚洲合集欧美合集| 在线免费观看日本一区| 欧美激情亚洲综合一区| 午夜视频在线观看一区| 蜜桃av综合| 欧美亚洲免费电影| 最近中文字幕mv在线一区二区三区四区 | 美女在线一区二区| 一区二区高清视频在线观看| 美女999久久久精品视频| 亚洲尤物在线视频观看| 亚洲国产日韩美| 狠狠色丁香久久婷婷综合_中| 欧美人成在线视频| 欧美成人小视频| 久久在线免费视频| 久久久久欧美精品| 午夜久久福利| 久久se精品一区精品二区| 久久综合五月天婷婷伊人| 欧美视频中文字幕在线| 国产主播精品在线| 亚洲精品在线视频| 久久女同精品一区二区| 亚洲美女一区| 免费观看日韩av| 国产综合色在线视频区| 一本色道久久综合亚洲精品按摩| 亚洲欧美精品伊人久久| 美女久久网站| 欧美一级成年大片在线观看| 欧美日韩一区二区三区| 亚洲国产美女| 亚洲欧美在线aaa| 欧美三区在线观看| 亚洲三级网站| 亚洲电影av在线| 狂野欧美性猛交xxxx巴西| 欧美成年人在线观看|