【转】厦门某公司的某道笔试题
时间:2011-01-24 来源:梧桐栖凤
有一组N*N的数据,外层是X,第二层是Y,第三层是0,接着是1,2,3......N-1,N
比如输入5,打印出:
X X X X X
X Y Y Y X
X Y 0 Y X
X Y Y Y X
X X X X X
输入7则打印:
X X X X X X X
X Y Y Y Y Y X
X Y 0 0 0 Y X
X Y 0 1 0 Y X
X Y 0 0 0 Y X
X Y Y Y Y Y X
X X X X X X X
由于感冒,思想不集中,写错了 - -b,今天跟低手兄弟说了下,他居然说了一个特别WS的想法....大意是这样: 将数组每次往内缩短填充.
嘿嘿果然好WS啊~~~贴下低手的思想,实现 by Root
///////////////////////////////////华丽的分割线///////////////////////////////////
#include <cstdlib>
#include <iostream>
using namespace std;
// 打印结果函数
void PrintResult( char** pResult, int nArrSize );
// 分配多维数组
char** MallocArray( int nSize );
// 释放分配的数组
void FreeArray( char** p, int nSize );
// 填充字符
void FillChar( char** p, int N, int nIndex, char ch );
//////////////////////////////////////////////////////////////////////////
// 低手兄弟的想法版本, code by Root
//////////////////////////////////////////////////////////////////////////
int main(void)
{
int N;
cout << "请输入N的值: ";
cin >> N;
// 分配多维数组
char** pszResult = MallocArray( N );
// 计算中心位置
int nCenter = N / 2 + N % 2;
// 记录增值
char chCount = '0';
for ( int nIndex = 0; nIndex < nCenter; nIndex++ )
{
// 填充X
if ( nIndex == 0 )
{
FillChar( pszResult, N, nIndex, 'X' );
continue;
}
// 填充Y
else if ( nIndex == 1 )
{
FillChar( pszResult, N, nIndex, 'Y' );
continue;
}
// 填充增值,并增加
FillChar( pszResult, N, nIndex, chCount++ );
}
// 打印结果
PrintResult( pszResult, N );
FreeArray( pszResult, N );
return 0;
}
// 打印结果函数
void PrintResult( char** pResult, int nArrSize )
{
for ( int i = 0; i < nArrSize; i++ )
{
for ( int j = 0; j < nArrSize; j++ )
{
cout << pResult[i][j] << " ";
}
// 回车
cout << endl;
}
cout << "Print End..." << endl;
}
// 分配多维数组
char** MallocArray( int nSize )
{
char **pResult = (char**)malloc( nSize * sizeof(char*) );
for(int nCol = 0; nCol < nSize; nCol++)
{
pResult[nCol] = (char*)malloc(nSize * sizeof(char));
}
return pResult;
}
// 释放分配的数组
void FreeArray( char** pArr, int nSize )
{
for ( int nCol = 0; nCol < nSize; nCol++ )
{
free( pArr[nCol] );
}
free( pArr );
}
// 填充字符
void FillChar( char** p, int N, int nIndex, char ch )
{
// 遍历整个数组,并填充数据
for ( int nCol = nIndex; nCol < N - nIndex; nCol++ )
{
for ( int nRow = nIndex; nRow < N - nIndex; nRow++ )
{
p[nCol][nRow] = ch;
}
}
}
///////////////////////////////////华丽的分割线///////////////////////////////////
话说那公司最吸引俺的地方就是那台咖啡机...
当然,这不是最优解,只是贴下低手兄弟WS的想法..哈哈,如果各位看官有更WS的想法欢迎贴出来分享分享,告诉下小弟,,谢谢
贴下结果图:
// 函数优化版,提升N个档次的性能
// 填充字符
void FillChar( char** p, int N, int nIndex, char ch )
{
// 对付中间值,以免对中间值进行4次赋值操作
if ( N % 2 == 1 )
{
int nCenter = N / 2 + N % 2;
if ( nCenter - 1 == nIndex )
{
p[nIndex][nIndex] = ch;
return;
}
}
for ( int nCol = nIndex; nCol < N - nIndex; nCol++ )
{
// 填充横行范围(上)
p[nIndex][nCol] = ch;
// 填充竖行(左)
p[nCol][nIndex] = ch;
// 右方
p[N - nIndex - 1][nCol] = ch;
// 下方
p[nCol][N - nIndex - 1] = ch;
}
}
文章来源:http://hi.baidu.com/cppcoffee/blog