亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? 迷宮view.cpp

?? 迷宮智能A*搜索的算法實現
?? CPP
字號:
// 迷宮View.cpp : implementation of the CMyView class
//

#include "stdafx.h"
#include "迷宮.h"

#include "迷宮Doc.h"
#include "迷宮View.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CMyView

IMPLEMENT_DYNCREATE(CMyView, CView)

BEGIN_MESSAGE_MAP(CMyView, CView)
	//{{AFX_MSG_MAP(CMyView)
	ON_WM_TIMER()
	ON_COMMAND(ID_RCREATM, OnRcreatm)
	ON_COMMAND(ID_DEEP, OnDeep)
	ON_COMMAND(ID_CHANGEM, OnChangem)
	ON_COMMAND(ID_ASTART, OnAstart)
	ON_COMMAND(ID_STOP, OnStop)
	//}}AFX_MSG_MAP
	// Standard printing commands
	ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CMyView construction/destruction

CMyView::CMyView()
{
	// TODO: add construction code here
	map=0;
	width=length=8;
	current=0;
	dlg=new CEDIT;
}

CMyView::~CMyView()
{
}

BOOL CMyView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CMyView drawing

void CMyView::OnDraw(CDC* pDC)
{
	CMyDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	// TODO: add draw code for native data here
	CDC MemDC;										// 定義一個內存DC(雙緩存)
	CBitmap MemBitmap;                              // 定義一個位圖對象
	CRect rect;

	GetClientRect(&rect);							// 獲得客戶區矩形
	MemDC.CreateCompatibleDC(NULL);                 // 建立與屏幕顯示兼容的DC
	
	// 建立一個與屏幕顯示兼容的位圖
	MemBitmap.CreateCompatibleBitmap(pDC, rect.Width(), rect.Height());
	MemDC.SelectObject(&MemBitmap);					// 將位圖選入DC

	// 用背景色將位圖填充
	MemDC.FillSolidRect(0, 0, rect.Width(), rect.Height(), RGB(255,255,255));
	MemDC.SetBkMode(TRANSPARENT);
	pDC->SetBkMode(TRANSPARENT);



	Drawmaze(&MemDC);
	Drawpath(&MemDC);
	Drawagent(&MemDC,NULL);
	// 然后將內存中的圖拷貝到屏幕上進行顯示

	pDC->BitBlt(0, 0, rect.Width(), rect.Height(), &MemDC, 0, 0, SRCCOPY);
	
	MemBitmap.DeleteObject();
 	MemDC.DeleteDC();
}

/////////////////////////////////////////////////////////////////////////////
// CMyView printing

BOOL CMyView::OnPreparePrinting(CPrintInfo* pInfo)
{
	// default preparation
	return DoPreparePrinting(pInfo);
}

void CMyView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add extra initialization before printing
}

void CMyView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add cleanup after printing
}

/////////////////////////////////////////////////////////////////////////////
// CMyView diagnostics

#ifdef _DEBUG
void CMyView::AssertValid() const
{
	CView::AssertValid();
}

void CMyView::Dump(CDumpContext& dc) const
{
	CView::Dump(dc);
}

CMyDoc* CMyView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMyDoc)));
	return (CMyDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CMyView message handlers

void CMyView::InitialMap(int newlength,int newwidth)
{
	if(map){
		for(int xx=0;xx<2*width+1;xx++)
			delete [] map[xx];
	//	delete [] map;
	}
	width=newwidth;
	length=newlength;
	static int seed=0;
	map=new int* [2*width+1];
	for(int i=0;i<=2*width+1;i++)
		map[i]=new int [2*length+2];
	for(i=0;i<=2*width+1;i++)
		for(int j=0;j<=2*length+1;j++)
			if(i==0||j==0||i==2*width+1||j==2*length+1)
				map[i][j]=-1;
				else
					map[i][j]=1;

	bool **node=new bool*[width];
	for(i=0;i<=width;i++)
		node[i]=new bool[length];
	for(i=0;i<=width;i++)
		for(int j=0;j<=length;j++)
			node[i][j]=false;
	node[0][0]=true;
	
	vector<int> x;
	vector<int> y;
	x.push_back(0);
	y.push_back(0);
	int tempx;
	int tempy;
	while(!x.empty()&&!y.empty()){
		srand(time(NULL));
		vector<int>::iterator itor1=x.begin(),itor2=y.begin();
		for(int t=0;t<rand()%x.size();t++){
			itor1++;
			itor2++;
		}
		tempx=*itor1;
		tempy=*itor2;
		x.erase(itor1);
		y.erase(itor2);
		map[tempy*2+1][tempx*2+1]=0;
		int movx[4]={0,0,-1,1};//選擇怎么移動
		int movy[4]={-1,1,0,0};
		int sel;
		for(int i=4;i>=1;i--){
			sel=rand()%i;
			if(tempx+movx[sel]<length&&tempx+movx[sel]>=0&&tempy+movy[sel]>=0&&tempy+movy[sel]<width&&!node[tempy+movy[sel]][tempx+movx[sel]]){
				node[tempy+movy[sel]][tempx+movx[sel]]=true;//標志結點訪問過
				x.insert(x.begin(),(tempx+movx[sel]));//壓入棧中
				y.insert(y.begin(),(tempy+movy[sel]));
				map[tempy*2+1][tempx*2+1]=0;
				map[(tempy*2+1+movy[sel])][(tempx*2+1+movx[sel])]=0;
				map[(tempy+movy[sel])*2+1][(tempx+movx[sel])*2+1]=0;
			}
			int temp=movx[sel];
		 	movx[sel]=movx[i-1];
			movx[i-1]=temp;
			temp=movy[sel];
			movy[sel]=movy[i-1];
			movy[i-1]=movy[sel];
			seed+=3;	
		}
	}
	map[width*2-1][length*2]=0;
	Invalidate();
}

CState* CMyView::Move(CState* x, int i)
{
	CState*	newstate=new	CState;
	int	movx[4]={1,0,-1,0};
	int	movy[4]={0,-1,0,1};
	*newstate=*x;
	newstate->father=x;
	if(i==0){
		newstate->D=(x->D+1)%4;
		newstate->cost=x->cost+1;
		if(map[newstate->R+movy[newstate->D]][newstate->C+movx[newstate->D]])
			return	0;
	}
	if(i==1){
		newstate->D=(x->D+3)%4;
		newstate->cost=x->cost+1;
		if(map[newstate->R+movy[newstate->D]][newstate->C+movx[newstate->D]])
			return	0;
	}	
	if(i==2){
		newstate->C+=movx[x->D];	
		newstate->R+=movy[x->D];
		newstate->cost=x->cost+2;
	}
	if(map[newstate->R][newstate->C])
		return	0;
	return newstate;
}
bool CMyView::Deepfirstscan()
{
	CState*	s0=new CState(1,0,0);
	CState*	sf=new CState(width*2-1,length*2,0);
	open.push_back(s0);
	while(!open.empty()){
		CState*	sn=new	CState;
		sn=open.back();
		closed.push_back(sn);
		if(*sn==*sf)
			return	true;
		open.pop_back();
		for(int i=0;i<3;i++){
			CState* newone=Move(sn,i);
			if(newone){
				if(i==0||i==1){
					CState*	forward=Move(newone,2);
					open.push_back(forward);
				}
				else
					open.push_back(newone);
				sn->son.push_back(open.back());
			}
		}
	}
	if(open.empty())
		return	false;
}

/*bool CMyView::Astar()
{
	CState*	s0=new CState(1,0,0);
	CState*	sf=new CState(width*2-1,length*2,0);
	open.push_back(s0);
	while(!open.empty()){
		CState*	sn=new	CState;
		sn=open.back();
		closed.push_back(sn);
		if(*sn==*sf)
			return true;
		open.pop_back();
	
		int v[3]={0,0,0};
		CState*	extend[3]={0,0,0};
		for(int i=0;i<3;i++){
			CState* newone=Move(sn,i);
			if(newone){
				if(i==0||i==1){
					CState*	forward=Move(newone,2);
					extend[i]=forward;
				}
				else
					extend[i]=newone;
				v[i]=Value(extend[i]);
			}
		}

		for(i=0;i<3;i++)
			for(int j=i+1;j<3;j++){
				if(v[i]<v[j]){
					int tempv=v[i];
					v[i]=v[j];
					v[j]=tempv;

					CState*	temps=extend[i];
					extend[i]=extend[j];
					extend[j]=temps;
				}
			}
		for(i=0;i<3;i++)
			if(extend[i]){
				open.push_back(extend[i]);
				sn->son.push_back(open.back());
			}
	}
	if(open.empty())
		return false;
}*/
bool CMyView::Astar()
{
	CState*	s0=new CState(1,0,0);
	CState*	sf=new CState(width*2-1,length*2,0);
	open.push_back(s0);
	while(!open.empty()){
		CState*	sn=new	CState;
		int i;
		sn=open.back();
		closed.push_back(sn);
		if(sn->father )
			sn->father->son.insert(sn->father->son.begin(),sn); 
		if(*sn==*sf)
			return true;
		open.pop_back();
		for(i=0;i<3;i++){
			CState* newone=Move(sn,i);
			if(newone){
				if(i==0||i==1){
					CState*	forward=Move(newone,2);
					//sn.son.push_back(sn);
					forward->father=sn;
					open.push_back(forward);
				}
				else
					open.push_back(newone);
			}
		}
		int num=open.size();
		int* v=new int[num];
		CState** extend=new CState*[num];
		for(i=0;i<num;i++){
			extend[i]=open.back();
			v[i]=Value(extend[i]);
			open.back()->son.clear();
			open.pop_back();
		}
		for(i=0;i<num;i++)
			for(int j=i+1;j<num;j++){
				if(v[i]<v[j]){
					int tempv=v[i];
					v[i]=v[j];
					v[j]=tempv;

					CState*	temps=extend[i];
					extend[i]=extend[j];
					extend[j]=temps;
				}
			}
		for(i=0;i<num;i++)
			open.push_back(extend[i]);
	}
	if(open.empty())
		return false;
}
bool CMyView::Widefirstscan()
{
	CState*	s0=new CState(1,0,0);
	CState*	sf=new CState(width*2-1,length*2,0);
	open.push_back(s0);
	while(!open.empty()){
		CState*	sn=new	CState;
		sn=open.back();
		closed.push_back(sn);
		if(*sn==*sf)
			return	true;
		open.pop_back();
		for(int i=0;i<3;i++){
			CState* newone=Move(sn,i);
			if(newone){
				if(i==0||i==1){
					CState*	forward=Move(newone,2);
					open.insert(open.begin(),forward);
				}
				else
					open.insert(open.begin(),newone);
			}
		}
	}
	if(open.empty())
		return	false;
}

void CMyView::Drawpath(CDC *pDC)
{
	if(closed.size()==0)
		return;
	int wide;
	CRect	Rect;
	GetWindowRect(&Rect);

	if( Rect.Width() / (2*width+1)>Rect.Height() / (2*length+1))
		wide=Rect.Height() / (2*length+1);
		else
			wide=Rect.Width() / (2*width+1);
	
	CPen	road(PS_SOLID,1,RGB(255	,0,0));
	CPen*	oldpen=pDC->SelectObject(&road);
	CState*	temp=closed.back();
	pDC->MoveTo(temp->C*wide+wide/2,temp->R*wide+wide/2);
	while(temp)
	{
		pDC->LineTo(temp->C*wide+wide/2,temp->R*wide+wide/2);
		temp=temp->father;
	}
}

void CMyView::Drawmaze(CDC *pDC)
{	
	if(!map)
		return;
	CBrush	wallpen;
	wallpen.CreateSolidBrush(RGB(0,120,0));

	CPen	wall(PS_SOLID,0,RGB(0,120,0));
	CBrush	passed;
	passed.CreateSolidBrush(RGB(200,200,230));
	CRect	Rect;
	GetWindowRect(&Rect);

	pDC->SelectObject(&wallpen);
	pDC->SelectObject(&wall);
	int wide;
	if( Rect.Width() / (2*width+1)>Rect.Height() / (2*length+1))
		wide=Rect.Height() / (2*length+1);
		else
			wide=Rect.Width() / (2*width+1);
	for(int i=0;i<2*width+1;i++)
		for(int j=0;j<2*length+1;j++)
			if(!(i==width*2-1&&j==length*2)&&!(i==1&&j==0))
				if((map[i][j]==1||map[i][j]==-1))
					pDC->Rectangle(wide*j,wide*i,wide*j+wide,wide*i+wide);
				else	if(map[i][j]==2){
					CBrush* oldbrush=pDC->SelectObject(&passed);
					pDC->Rectangle(wide*j,wide*i,wide*j+wide,wide*i+wide);
					pDC->SelectObject(oldbrush);
				} 
}
int CMyView::Value(CState* x)
{
	return	x->cost+(width*2-1 - x->C)+(length*2 - x->R);
}

void CMyView::Drawagent(CDC *pDC,CState* x)
{
	int wide;
	CRect	Rect;
	GetWindowRect(&Rect);
	if( Rect.Width() / (2*width+1)>Rect.Height() / (2*length+1))
		wide=Rect.Height() / (2*length+1);
		else
			wide=Rect.Width() / (2*width+1);
	CPen	road(PS_SOLID,1,RGB(255	,0,0));
	CPen*	oldpen=pDC->SelectObject(&road);
	if(current){
		pDC->Ellipse(current->C*wide,current->R*wide,current->C*wide+wide,current->R*wide+wide);
		pDC->SelectObject(oldpen);
		pDC->MoveTo(current->C*wide+wide/2,current->R*wide+wide/2);
		switch(current->D){
		case	0:	pDC->LineTo(current->C*wide+wide,current->R*wide+wide/2) ;
					break;
		case	1:	pDC->LineTo(current->C*wide+wide/2,current->R*wide); 
					break;
		case	2:	pDC->LineTo(current->C*wide,current->R*wide+wide/2);
					break;
		case	3:	pDC->LineTo(current->C*wide+wide/2,current->R*wide+wide);
					break;	
		}
	}
}

CState* CMyView::Next(CState *x)
{
	if(x->son.size()==0)
		return x->father;
	CState*	y=x->son.back();
	x->son.pop_back();
	return y;
}

void CMyView::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default
	if(drawing){
			CState	sf=CState(width*2-1,length*2,0);
			if(current){
				if(*current==sf){
					CString	str;
					str.Format("共負出代價: %d",current->cost);
					drawing=false;
					MessageBox(str);
					return;
				}
				map[current->R][current->C]=2;
				current=Next(current);
				allcost+=current->cost; 
			}
		Invalidate(false);
	}
	CView::OnTimer(nIDEvent);
}

void CMyView::OnRcreatm() 
{
	// TODO: Add your command handler code here
	InitialMap(width,length);
}

void CMyView::OnDeep() 
{
	// TODO: Add your command handler code here
	if(!map){
		MessageBox("請先生成迷宮");
		return;
	}
	for(int i=1;i<=width*2;i++)
		for(int j=1;j<=length*2;j++)
			if(map[i][j]==2)
				map[i][j]=0;
	open.clear();
	closed.clear();
	bool haveapath;
	haveapath=Deepfirstscan();
	if(!haveapath){
		MessageBox("沒有通路");
		return;
	}
	current=closed.front();
	drawing=true;
	SetTimer(1,100,NULL);
	allcost=0;
}

void CMyView::OnChangem() 
{
	// TODO: Add your command handler code here
	dlg->DoModal();
	InitialMap(dlg->m_L ,dlg->m_W );
}

void CMyView::OnAstart() 
{
	// TODO: Add your command handler code here
		if(!map){
		MessageBox("請先生成迷宮");
		return;
	}
	for(int i=1;i<=width*2;i++)
		for(int j=1;j<=length*2;j++)
			if(map[i][j]==2)
				map[i][j]=0;
	open.clear();
	closed.clear();

	bool haveapath;
	haveapath=Astar();
	if(!haveapath){
		MessageBox("沒有通路");
		return;
	}
	current=closed.front();
	drawing=true;
	SetTimer(1,100,NULL);
	allcost=0;
}

void CMyView::OnStop() 
{
	// TODO: Add your command handler code here
	drawing=false;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
美女网站在线免费欧美精品| 在线免费亚洲电影| 欧美一区二区女人| 一二三四区精品视频| 91视频在线观看| 国产精品第五页| 成人福利电影精品一区二区在线观看| 久久视频一区二区| 狠狠色伊人亚洲综合成人| 欧美日韩精品一区二区在线播放 | 精品伦理精品一区| 青青草91视频| 日韩一级片网址| 天天综合网 天天综合色| 欧美日韩一区二区在线观看视频 | 国产亲近乱来精品视频| 国产成人在线视频网站| 国产日韩欧美亚洲| 成人免费视频视频在线观看免费 | 久久精品一区二区三区四区| 国产乱国产乱300精品| 久久精品视频免费| 丁香啪啪综合成人亚洲小说| 中文字幕亚洲精品在线观看| 99久久99久久精品免费观看| 亚洲欧美日韩系列| 91麻豆国产自产在线观看| 一区二区三区中文字幕精品精品| 欧美视频一区在线观看| 亚洲国产日日夜夜| 91精品国产一区二区三区香蕉| 秋霞电影网一区二区| 欧美电影精品一区二区| 国产最新精品精品你懂的| 国产三级一区二区三区| 99国产精品国产精品毛片| 一区二区三区.www| 在线91免费看| 国产美女娇喘av呻吟久久| 欧美国产禁国产网站cc| 91色视频在线| 日韩在线一区二区| 精品国产一区二区三区四区四| 国产伦理精品不卡| 一区二区中文字幕在线| 欧美三级中文字| 久久国产精品一区二区| 国产亚洲婷婷免费| www.欧美日韩| 亚洲一区二区视频在线| 欧美成人性战久久| 成人激情开心网| 亚洲一区二区三区四区不卡| 欧美一区二区三区精品| 国产98色在线|日韩| 亚洲一级电影视频| 精品国产三级电影在线观看| av在线播放成人| 日本成人在线不卡视频| 日本一区二区三区国色天香| 色偷偷88欧美精品久久久 | 亚洲人精品一区| 欧美丰满少妇xxxxx高潮对白 | 国产福利一区二区三区视频在线| 日韩理论片网站| 日韩欧美亚洲国产精品字幕久久久| 国产成人av在线影院| 亚洲一区二区三区三| 精品国产伦理网| 一本高清dvd不卡在线观看 | 日韩成人午夜精品| 国产精品每日更新在线播放网址| 欧美美女一区二区| 成人丝袜高跟foot| 日一区二区三区| 国产精品萝li| 欧美精品1区2区3区| 成人午夜电影小说| 丝袜美腿成人在线| 国产精品乱人伦一区二区| 91精品国产欧美日韩| 91在线码无精品| 国模大尺度一区二区三区| 亚洲第一电影网| 中文字幕欧美激情| 欧美一区二区三区成人| 色婷婷久久久久swag精品 | 国产精品99久久久久久似苏梦涵 | 欧美激情在线观看视频免费| 欧美久久久久中文字幕| 972aa.com艺术欧美| 激情综合色综合久久综合| 亚洲一区中文在线| 国产精品久久久久久久午夜片 | 91成人国产精品| 东方欧美亚洲色图在线| 日本美女视频一区二区| 一区二区三区四区亚洲| 国产精品久久久久久久久久久免费看| 欧美一区二区三区免费视频| 色噜噜偷拍精品综合在线| 国产成人av影院| 毛片av一区二区三区| 亚洲一区在线观看免费| 亚洲三级理论片| 国产亚洲人成网站| 欧美tk—视频vk| 欧美精品三级在线观看| 91国内精品野花午夜精品| 成人av高清在线| 国产成人av电影在线观看| 久久99日本精品| 婷婷综合在线观看| 夜夜精品浪潮av一区二区三区| 国产精品久久久久久亚洲毛片 | 中文字幕电影一区| 精品福利一二区| 欧美电视剧免费观看| 欧美精品在线视频| 欧美揉bbbbb揉bbbbb| 色欧美日韩亚洲| 91在线一区二区| 日韩欧美国产综合在线一区二区三区| 欧美日韩卡一卡二| 欧美亚洲综合一区| 色综合激情五月| 一本色道a无线码一区v| 91麻豆成人久久精品二区三区| av高清不卡在线| 91在线国产福利| 色综合天天综合网天天看片| av在线综合网| av中文一区二区三区| 91小视频免费观看| 91蜜桃免费观看视频| 色综合久久66| 欧美三级日韩三级| 欧美伦理电影网| 91精品久久久久久久久99蜜臂| 91精品国产色综合久久不卡电影| 欧美一卡二卡三卡| 日韩欧美三级在线| 精品福利一区二区三区免费视频| xfplay精品久久| 日本一区二区免费在线观看视频| 国产蜜臀av在线一区二区三区| 欧美国产精品久久| 亚洲三级理论片| 一区二区三区四区中文字幕| 香港成人在线视频| 日韩成人一区二区三区在线观看| 美脚の诱脚舐め脚责91| 精品在线播放免费| 国产传媒一区在线| 波多野结衣91| 在线免费观看成人短视频| 欧美三日本三级三级在线播放| 4438x亚洲最大成人网| 精品嫩草影院久久| 亚洲国产成人在线| 亚洲激情网站免费观看| 日韩专区一卡二卡| 国产综合色视频| av一区二区久久| 在线亚洲一区二区| 欧美精品tushy高清| 亚洲精品在线观看视频| 欧美激情一区在线| 日韩一区在线看| 亚洲成人先锋电影| 久久av中文字幕片| 不卡的av中国片| 欧美撒尿777hd撒尿| 欧美mv日韩mv亚洲| 国产精品国模大尺度视频| 亚洲综合丝袜美腿| 免费看欧美女人艹b| 国产99久久精品| 欧美写真视频网站| 精品美女在线播放| 亚洲免费观看高清完整版在线| 日韩黄色免费网站| 成人性生交大片免费看中文| 欧美唯美清纯偷拍| 久久综合久久99| 亚洲日本在线视频观看| 琪琪久久久久日韩精品| 成人免费视频视频| 4438x成人网最大色成网站| 国产欧美一区二区精品性| 亚洲一区二区三区激情| 国产一区欧美二区| 色综合久久88色综合天天| 2欧美一区二区三区在线观看视频 337p粉嫩大胆噜噜噜噜噜91av | 色乱码一区二区三区88| 日韩天堂在线观看| 综合网在线视频| 美女脱光内衣内裤视频久久影院| 成人午夜av影视| 91精品国产一区二区三区蜜臀|