网上流传的一面试题目
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文件
//.cpp文件
//示例调用
示例代码的输出结果:
只要细细思考一下,算是蛮容易的哈。
题目的意思给一个初始值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");
示例代码的输出结果:
只要细细思考一下,算是蛮容易的哈。
相关文章推荐
- asp.net c# 网上搜集面试题目大全(附答案) C#习题大全
- .NET面试题目小结,寻自网上
- asp.net c# 网上搜集面试题目大全(附答案)
- 网上流传的微软面试逻辑题分析
- c# 网上搜集面试题目大全
- asp.net c# 网上搜集面试题目大全(附答案)
- 【转】asp.net c# 网上搜集面试题目大全(附答案)
- 网上收集的C++面试题目
- 对网上流传的JAVA面试题或笔试题其中几个题目答案的质疑
- 今天在网上看到一个百度的C++面试题目
- 网上找的hadoop面试题目及答案
- [转]asp.net c# 网上搜集面试题目(附答案)
- 腾讯面试题目之一
- ZZ 算法面试101题目(原作者不详)
- [转]面试java架构师的比较变态的题目
- 经典SQL面试题目
- 华为各类工程师通信基础面试题目及答案
- 华为面试/笔试题目(附答案)
- linux驱动面试题目汇总
- 【转载】经典.net面试题目【为了笔试。。。。。】