📄 ltldoc.cpp
字号:
// LTLDoc.cpp : implementation of the CLTLDoc class
//
#include "stdafx.h"
#include "LTL.h"
#include "LTLDoc.h"
#include <time.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CLTLDoc
IMPLEMENT_DYNCREATE(CLTLDoc, CDocument)
BEGIN_MESSAGE_MAP(CLTLDoc, CDocument)
//{{AFX_MSG_MAP(CLTLDoc)
// NOTE - the ClassWizard will add and remove mapping macros here.
// DO NOT EDIT what you see in these blocks of generated code!
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CLTLDoc construction/destruction
CLTLDoc::CLTLDoc()
{
Init();
}
CLTLDoc::~CLTLDoc()
{
}
BOOL CLTLDoc::OnNewDocument()
{
if (!CDocument::OnNewDocument())
return FALSE;
// TODO: add reinitialization code here
// (SDI documents will reuse this document)
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////
// CLTLDoc serialization
void CLTLDoc::Serialize(CArchive& ar)
{
// CObject::Serialize(ar);
if (ar.IsStoring())
{
for(int i=0; i<10; i++)
for(int j=0; j<14; j++)
ar<<PicMark[i][j];
int n = m_pointA.GetSize();
ar<<n;
for(i=0; i<n; i++)
ar<<m_pointA[i];
ar<<disappear;
ar<<overflag;
ar<<Path[0];
ar<<Path[1];
ar<<pos;
ar<<TimeUsed;
}
else
{
for(int i=0; i<10; i++)
for(int j=0; j<14; j++)
ar>>PicMark[i][j];
int n;
ar>>n;
m_pointA.RemoveAll();
for(i=0; i<n; i++)
{
CPoint pt;ar>>pt;
m_pointA.Add(pt);
}
ar>>disappear;
ar>>overflag;
ar>>Path[0];
ar>>Path[1];
ar>>pos;
ar>>TimeUsed;
// UpdateAllViews(NULL);
}
}
/////////////////////////////////////////////////////////////////////////////
// CLTLDoc diagnostics
#ifdef _DEBUG
void CLTLDoc::AssertValid() const
{
CDocument::AssertValid();
}
void CLTLDoc::Dump(CDumpContext& dc) const
{
CDocument::Dump(dc);
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CLTLDoc commands
bool CLTLDoc::IfLine(const CPoint& pt1, const CPoint& pt2, CPoint* Path)
{
int i1 = pt1.y/64; //pt1
int j1 = pt1.x/64;
int i2 = pt2.y/64; //pt2
int j2 = pt2.x/64;
if(i1 == i2 && j1 == j2) //重合
return false;
char t0 = PicMark[i1][j1];
char t2 = PicMark[i2][j2];
if(t0 != t2) return false;
int i,j;
int il,jl,ir,jr; //按左右或下上存放两点
CPoint pt;
PicMark[i1][j1] = 0;
PicMark[i2][j2] = 0;
if(j1 != j2) //列寻找路径
{
int u1,d1,u2,d2;
if(j1 > j2){ jl = j2; il = i2; jr = j1; ir = i1;}
else { jl = j1; il = i1; jr = j2; ir = i2;}
for(i=il-1,u1=il; i>=0; i--) //从点l往上找最上端0点
if(PicMark[i][jl] != 0)
break;
else u1 = i;
for(i=il+1,d1=il; i<10; i++) //从点l往上找最下端0点
if(PicMark[i][jl] != 0)
break;
else d1 = i;
for(i=ir-1,u2=ir; i>=0; i--) //从点r往上找最上端0点
if(PicMark[i][jr] != 0)
break;
else u2 =i;
for(i=ir+1,d2=ir; i<10; i++) //从点r往上找最下端0点
if(PicMark[i][jr] != 0)
break;
else d2 = i;
if(u1 > d2 || d1 < u2) //此情况无解
goto DOCOL;
if(u1 < u2) u1 = u2; //取大值
if(d1 > d2) d1 = d2; //取小值
for(i=d1; i>=u1; i--)
{
for(j=jl; j<=jr; j++)
if(PicMark[i][j] != 0)
break;
if(j != jr+1) continue;
Path[0].x = j1*64; Path[0].y = i*64;
Path[1].x = j2*64; Path[1].y = i*64;
goto ENDT;
}
}
DOCOL:
if(i1 != i2) //行寻找路径
{
int l1,r1,l2,r2;
if(i1 < i2){ il = i2; ir = i1; jl = j2; jr = j1;} //下面的点在l 上面的点在r
else { il = i1; ir = i2; jl = j1; jr = j2;}
for(j=jl-1,l1=jl; j>=0; j--) //从点l往左找最左端0点
if(PicMark[il][j] != 0)
break;
else l1 = j;
for(j=jl+1,r1=jl; j<14; j++) //从点l往右找最右端0点
if(PicMark[il][j] != 0)
break;
else r1 = j;
for(j=jr-1,l2=jr; j>=0; j--) //从点r往左找最左端0点
if(PicMark[ir][j] != 0)
break;
else l2 = j;
for(j=jr+1,r2=jr; j<14; j++) //从点r往右找最右端0点
if(PicMark[ir][j] != 0)
break;
else r2 = j;
if(r1 < l2 || l1 > r2) //此情况无解
goto ENDF;
if(l1 < l2) l1 = l2; //取大值
if(r1 > r2) r1 = r2; //取小值
for(j=l1; j<=r1; j++)
{
for(i=il; i>=ir; i--)
if(PicMark[i][j] != 0)
break;
if(i != ir-1) continue;
Path[0].x = j*64; Path[0].y = i1*64;
Path[1].x = j*64; Path[1].y = i2*64;
goto ENDT;
}
}
ENDF:
PicMark[i1][j1] = t0;
PicMark[i2][j2] = t2;
return false;
ENDT:
PicMark[i1][j1] = t0;
PicMark[i2][j2] = t2;
return true;
}
void CLTLDoc::Init()
{
m_pointA.SetSize(0);
int PicUseTimes[16] = {0};
char c;
disappear = 0;
srand(long(time(NULL)));
for(int i=0; i<=9; i++)
for(int j=0; j<=13; j++)
{
if(i == 0 || i == 9 || j == 0 || j== 13){
PicMark[i][j] = 0;
continue;
}
c = rand()%16+'a';
while(PicUseTimes[c-'a'] == 6)
{
c++;
if(c > 'p')
c = 'a';
}
PicUseTimes[c-'a']++;
PicMark[i][j] = c;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -