您的位置:首页 > 职场人生

网上流传的一面试题目

2010-05-17 23:46 239 查看
先来看一副图吧:



题目的意思给一个初始值6,打印如上图形,先仔细分析分析看:

1.图形是6行6列;

2.从第一行第一列的位置开始,转圈,数值依次增加;

3.第一列第一行的初始值是1;

进一步分析:

1:起始值:x=0,y=0,direction=right,startValue=1;

2:循环条件:若能沿着上一次的方向,则继续,否则,从right到bottom,从bottom到left,从left到top,从top到right,循环迭代;

3:终止条件,找不到direction;

至此,大概有一个思路了,依据当前的位置信息,找出下一个位置信息,依次循环;

贴个刚写的代码:

// .h文件

enum enDirection
{
EN_LEFT,
EN_TOP,
EN_RIGHT,
EN_BOTTOM,
};

struct SDirectionInfo
{
enDirection e;
unsigned int unX;
unsigned int unY;
int nVal;
};

class CPrintDemo
{
public:
CPrintDemo();
virtual ~CPrintDemo();

//////////////////////////////////////////////////////////////////////////
public:
// init param
void Init(unsigned int unMaxLen, int nStart=1);
void Sort();
void Print();

private:
// use input info get the out info
bool __FindNexDirection(enDirection& e, int nX, int nY);

private:
typedef std::vector<int> VAL_CONTAINER;
VAL_CONTAINER m_cVal;

unsigned int m_unMaxLen;
int m_nStart;

};


//.cpp文件

CPrintDemo::CPrintDemo()
:m_unMaxLen(0)
,m_nStart(0)
{

}

CPrintDemo::~CPrintDemo()
{

}

void CPrintDemo::Init(unsigned int unMaxLen, int nStart)
{
m_unMaxLen = unMaxLen;
m_nStart = nStart;
}

void CPrintDemo::Sort()
{
if (m_unMaxLen <= 1)
{
return;
}

m_cVal.assign( m_unMaxLen * m_unMaxLen, 0);

bool bFind = false;

int nX = 0;
int nY = 0;
int nVal = m_nStart;

enDirection e = EN_RIGHT;

for (int i=0; i<m_unMaxLen* m_unMaxLen; ++i)
{
m_cVal[nY * m_unMaxLen + nX ] = nVal;

bFind = __FindNexDirection(e, nX, nY);
if (!bFind)
{
break;
}

switch(e)
{
case EN_LEFT:
{
--nX;
}
break;
case EN_TOP:
{
--nY;
}
break;
case EN_RIGHT:
{
++nX;
}
break;
case EN_BOTTOM:
{
++nY;
}
break;
default:
break;
}
++nVal;

}

}

void CPrintDemo::Print()
{
for (size_t i=0; i<m_cVal.size(); ++i)
{
if ( 0 == i % m_unMaxLen)
{
printf("/n");
}
printf("%4d ", m_cVal[i]);
}
}

bool CPrintDemo::__FindNexDirection(enDirection& e, int nX, int nY)
{
bool bRet = false;
switch(e)
{
case EN_LEFT:
{
if (0 == nX || 0 != m_cVal[nY * m_unMaxLen + nX - 1])
{
e = EN_TOP;
bRet = true;
}
else if (0 == m_cVal[nY * m_unMaxLen + nX - 1])
{
bRet = true;
}
}
break;
case EN_TOP:
{
if (0 == nY || 0 != m_cVal[(nY - 1) * m_unMaxLen + nX])
{
e = EN_RIGHT;
bRet = true;
}
else if (0 == m_cVal[(nY - 1) * m_unMaxLen + nX])
{
bRet = true;
}
}
break;
case EN_RIGHT:
{
if (nX == m_unMaxLen - 1 || 0 != m_cVal[nY * m_unMaxLen + nX + 1])
{
e = EN_BOTTOM;
bRet = true;
}
else if (0 == m_cVal[nY * m_unMaxLen + nX + 1])
{
bRet = true;
}
}
break;
case EN_BOTTOM:
{
if (nY == m_unMaxLen - 1 || 0 != m_cVal[(nY + 1) * m_unMaxLen + nX])
{
e = EN_LEFT;
bRet = true;
}
else if (0 == m_cVal[(nY + 1) * m_unMaxLen + nX])
{
bRet = true;
}
}
break;
default:
break;
}

return bRet;
}


//示例调用

CPrintDemo oDemo;
oDemo.Init(5);
oDemo.Sort();
oDemo.Print();
::printf("/n/n");

oDemo.Init(6);
oDemo.Sort();
oDemo.Print();
::printf("/n/n");

oDemo.Init(6, 100);
oDemo.Sort();
oDemo.Print();
::printf("/n/n");


示例代码的输出结果:



只要细细思考一下,算是蛮容易的哈。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: