昨天去面试,一个图行算法,难死我了!

flying520520 2003-11-22 10:14:06
昨天被通知面试上机复试!抽到一个图形算法的题,难死我了,没搞定!也让你们享用一下吧!
   一个1600*800的图形(单色的),其信息存放在一个char phto[800][200]的数组,每个phto[200]中要存放1600个像素的信息,有像素的位置1,无像素的位置0。其中phto[800][200]中存放的是十六进制的数!

 要求编写一个算法,随便画个什么波形(正弦,余弦等),最后把图形信息存放在数组 phto[800][200]中,并反回。

md ,我编了一个上午,把算法接到他们的测试程序上就是不出图,对位操作总是有点有适应!

  那公司开价2K,不问学历,不看证件,编出算法的就OK,给2K。

看来我的水平不够2K,各位老大进来看一看,有能力拿2K的请出手,把你们的算法给小弟一观!
  (我把问题描述清楚了没有?)不甘心啊!再找不到工作,明天就把高程证给烧烧掉!
...全文
117 33 打赏 收藏 转发到动态 举报
写回复
用AI写文章
33 条回复
切换为时间正序
请发表友善的回复…
发表回复
flying520520 2003-11-27
  • 打赏
  • 举报
回复
*******************************新的问题************************************
***************************************************************************



前些时候在此地经高人指点,学了几手,突发奇想,写了以下的代码,但有错误请帮忙看一下。

***************************************************************************************
//将单色位图的部人份数据信息数入一个g_print[800][200]数组,然后在ondraw()中以点的形式显示出来,
//显示结果不正确,与原位图形状不符。可能是对位图结构没有正确的理解吧!




//#include "print.h"

char g_print[800][200]; //全局数据,
****************************************************************************************
BOOL m_bValid; //是否有效
RGBQUAD* m_pRGBQuad; //RGBQUAD 表项
BYTE* m_pDibData; //位图像素数据
LONG m_nWidth; //宽度
LONG m_nHeight; //高度
BYTE m_nBitCount; //每个像素占有的位数
UINT m_nTotalColors; //颜色总数
char* m_pszFileName;
BITMAPFILEHEADER* m_pBitmapFileHeader;
BITMAPINFOHEADER* m_pBitmapInfoHeader;
BITMAPINFO* m_pBitmapInfo;
HGLOBAL m_hDIB;

void Init()
{
m_pRGBQuad = NULL; //RGBQUAD 表项
m_pDibData = NULL; //位图像素数据
m_nWidth = 0; //宽度
m_nHeight = 0; //高度
m_nBitCount = 0; //每个像素占有的位数
m_nTotalColors = 0; //颜色总数
m_pBitmapFileHeader = NULL;
m_pBitmapInfoHeader = NULL;
m_pBitmapInfo = NULL;
m_hDIB = 0;
m_pszFileName = NULL;
}


DWORD GetDibWidthBytes(int nWidth, BYTE byBitCount)
{
DWORD dwWidthBytes = (DWORD)nWidth; //8-bits
if(byBitCount == 1) dwWidthBytes = (nWidth + 7) / 8;
else if(byBitCount == 4) dwWidthBytes = (nWidth + 1) / 2;
else if(byBitCount == 24) dwWidthBytes = 3 * nWidth ;

while((dwWidthBytes & 3) != 0)
dwWidthBytes++;

return dwWidthBytes;
}

DWORD GetSize()
{
if (m_pBitmapInfoHeader->biSizeImage != 0)
return (m_pBitmapInfoHeader->biSizeImage);
else
return (DWORD)GetDibWidthBytes(m_nWidth, 24) * (DWORD)m_nHeight;
}

UINT GetColorNumber()
{
UINT nColors = 0;

if ((m_pBitmapInfoHeader->biClrUsed == 0) &&
(m_pBitmapInfoHeader->biBitCount < 9))//不考虑24色
{
switch (m_pBitmapInfoHeader->biBitCount)
{
case 1: nColors = 2; break;
case 4: nColors = 16; break;
case 8: nColors = 256;break;
}
}
else
nColors = (UINT) m_pBitmapInfoHeader->biClrUsed;

return nColors;
}

void LoadFile(const char* pszDibFileName)
{
ASSERT(pszDibFileName);
//如果存在就释放内存
if(m_pBitmapInfo) ::GlobalFree(m_hDIB);
//再次初始化, 用于多次动态重用
Init();
m_pszFileName = (char*)pszDibFileName;

BITMAPFILEHEADER bitmapFileHeader;

CFile dibFile(pszDibFileName, CFile::modeRead);
try
{
//读入位图文件头信息
UINT nBFHsize = dibFile.Read((void*)&bitmapFileHeader, sizeof(BITMAPFILEHEADER));
if(nBFHsize != sizeof(BITMAPFILEHEADER))
{
m_bValid = FALSE;
return;
}
}
catch(CFileException* e)
{
e->Delete();
}

//如果为位图就进行下一步的处理
if (bitmapFileHeader.bfType == 0x4d42)
{
AfxGetApp()->BeginWaitCursor();

//文件长度
DWORD dwFileLength = dibFile.GetLength();

//位图信息及位图数据的大小(字节)
DWORD dwSize = dwFileLength - sizeof(BITMAPFILEHEADER);
//为文件头,位图头颜色表的总长

//为Dib分配全局内存,注意这个和LocalAlloc()分配内存的方式不一样。
m_hDIB = (HGLOBAL) ::GlobalAlloc(GMEM_MOVEABLE, dwSize);
if (m_hDIB == 0) m_bValid = FALSE;

//指向Dib实际像素数据的指针,
BYTE* pbyDib = (BYTE*)::GlobalLock(m_hDIB);
if (pbyDib == NULL) m_bValid = FALSE;

try
{
//读入内存
DWORD dwReadSize = dibFile.Read((void*)pbyDib, dwSize);
dibFile.Close();
if(dwReadSize != dwSize)
{
m_bValid = FALSE;
::GlobalUnlock(m_hDIB);
::GlobalFree(m_hDIB);
Init();
return;
}
}
catch(CFileException* e)
{
e->Delete();
}

//获取位图文件头指针和位图文件数据信息指针
m_pBitmapInfo = (BITMAPINFO*) pbyDib;
m_pBitmapInfoHeader = (BITMAPINFOHEADER*) pbyDib;

//宽度和高度
m_nWidth = m_pBitmapInfoHeader->biWidth;
m_nHeight = m_pBitmapInfoHeader->biHeight;
//每像素的颜色位数
m_nBitCount = (BYTE)m_pBitmapInfoHeader->biBitCount;
//只处理双色位图
if(m_nBitCount != 1)//************************只是修改了此一处
return;
//颜色数
m_nTotalColors = GetColorNumber();
if (m_pBitmapInfoHeader->biClrUsed == 0)
m_pBitmapInfoHeader->biClrUsed = m_nTotalColors;

//指向位图颜色索引表项的指针, 如果没有颜色表项, 则该值为NULL
m_pRGBQuad = (RGBQUAD*)(pbyDib + m_pBitmapInfoHeader->biSize);

//颜色索引表的大小(字节)
DWORD dwColorTableSize = m_nTotalColors * sizeof(RGBQUAD);

//指向位图数据的指针
m_pDibData = pbyDib + m_pBitmapInfoHeader->biSize + dwColorTableSize;

//如果没有颜色索引表, 则该值为NULL
if (m_pRGBQuad == (RGBQUAD*)m_pDibData) m_pRGBQuad = NULL;

//位图的大小(面积像素单位)
m_pBitmapInfoHeader->biSizeImage = GetSize();
::GlobalUnlock(m_hDIB);
m_bValid = TRUE;


}
else
{
AfxMessageBox("This is not a bitmap file!");
m_bValid = FALSE;
}
}
}

//以上代码是借鉴前的人,仅修改了一处
*******************************************************************************************************
*******************************************************************************************************
*******************************************************************************************************
void FilePrint()//我想最主要的错误可以是在这个地方,
{
LoadFile("c:\\qrs.bmp");
CFile filebmp;
filebmp.Open("c:\\qrs.bmp",CFile::modeRead);
filebmp.Seek(62,CFile::begin);//定位到数据区,62=14+40+8
char printData[800][200];
char *data=new char[(filebmp.GetLength()-62)/sizeof(char)];
filebmp.Seek(62,CFile::begin);
filebmp.Read(data,filebmp.GetLength()-62);
char *p;
for(int i=0;i<800;i++)
{
p=(char*)(data+i*(m_nWidth + 7) / 8);

for(int j=0;j<200;j++)
{
printData[i][j] =0xff-(char)*(p+j);
g_print[i][j]=printData[i][j];

}
}

}
******************************************************************************************************
******************************************************************************************************
int GetPix(int x,int y)
{
int ret=0;
int a=y/8;
int b=y%8;
int c=1<<b;
char *p=&g_print[x][a];
if(((*p)&c)!=0)
ret=1;
return ret;
}

//将数据中的数据显示为图形
void CECGprintView::OnDraw(CDC* pDC)
{
CECGprintDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
ClearMap();

FilePrint();//读取位图信息
for(int i=0;i<800;i++)
{
for(int j=0;j<1600;j++)
{
if(GetPix(i,j)==1) //判断是否有像素
{
pDC->SetPixel(j,i,RGB(255,0,0));
}
}
}

}
flying520520 2003-11-24
  • 打赏
  • 举报
回复
不问学历//本科以上
不看证书//高程既可
2K//???????
superdai 2003-11-24
  • 打赏
  • 举报
回复
M
flying520520 2003-11-24
  • 打赏
  • 举报
回复
MD,我发的帖,为什么不让结了(提示无权结帖),各位老大,别急,明天再给分吧 !
bluebohe 2003-11-22
  • 打赏
  • 举报
回复
我觉得大多数公司都不会看你有什么证的,我只有全国二级证
呵呵,不过我现在也没在啥好公司,海南没有软件好的公司
bluebohe 2003-11-22
  • 打赏
  • 举报
回复
不难吧,一个小时,能够搞定,你等我一个小时
byry 2003-11-22
  • 打赏
  • 举报
回复
MD,才2K,老子要是能编出来就要他5K
wcaowu 2003-11-22
  • 打赏
  • 举报
回复
"天就把高程证给烧烧掉"
!!!!!!!!!!
支持!!!!!!
zhang_zhibin 2003-11-22
  • 打赏
  • 举报
回复
没兴趣去做了,不过不难。
syisunny 2003-11-22
  • 打赏
  • 举报
回复
为了2k,就这样!!是$还是¥?
GR 2003-11-22
  • 打赏
  • 举报
回复
这篇MARK一下。温故知新
flying520520 2003-11-22
  • 打赏
  • 举报
回复
老大们,还和MM聊一次,明天把她删掉,还有,高程证的也不要了,烧掉

以报各位捧场
还有bluebohe(薄荷):
flying520520 2003-11-22
  • 打赏
  • 举报
回复
武汉武圣路有一家
那有好几个中专生,且没证,我同学就在那里
还让他们带
flying520520 2003-11-22
  • 打赏
  • 举报
回复
bluebohe(薄荷): 我再看看,不和MM聊了,对不起,我多多给分就是

你的 2K
wuxq 2003-11-22
  • 打赏
  • 举报
回复
bluebohe(薄荷)做的不错,只是flying520520 (老北风)无法理解,要努力啊,高程是不能说明问题的。这个题目很简单的
romberg2002 2003-11-22
  • 打赏
  • 举报
回复
楼上的大哥,楼主的意思不是要在屏幕上画出图像,而仅仅是把图像进行压缩(所谓的压缩,其实还要跟颜色索引联系上才对),其实就是把用8个字节表示的[0,1]转换到用以个字节表示的[0,255]中,你提供的函数功能太过于复杂,用在这里有些屈。
bluebohe 2003-11-22
  • 打赏
  • 举报
回复
建议你再好好研究一下我的代码吧,不要随随便便就说不正确,我的DrawPixel函数的功能正是找到合适的“位”去存一个像素的值
romberg2002 2003-11-22
  • 打赏
  • 举报
回复
修改:
BOOL TransData(const char* pInData, unsinged char* pOutData, int nW/*=1600*/, int nH/*=200*/, int nColorNum/*=1*/)
{
//不再做合法性检查
//每行实际字节数, 8个像素对应一个字节.
LONG nLineBytes = (nW + 7) / 8;
for(int i = 0; i < nH; i++)
{
for(int j = 0; j < nLineBytes; j++)
{
if((j+1)/8 == 0)
pOutData++;
(*pOutData) = (*pOutData)&((*(pInData+i*nLineBytes+j))<<(7-(j%8)));
}
}
}
romberg2002 2003-11-22
  • 打赏
  • 举报
回复
BOOL m_bValid; //是否有效
RGBQUAD* m_pRGBQuad; //RGBQUAD 表项
BYTE* m_pDibData; //位图像素数据
LONG m_nWidth; //宽度
LONG m_nHeight; //高度
BYTE m_nBitCount; //每个像素占有的位数
UINT m_nTotalColors; //颜色总数
char* m_pszFileName;
BITMAPFILEHEADER* m_pBitmapFileHeader;
BITMAPINFOHEADER* m_pBitmapInfoHeader;
BITMAPINFO* m_pBitmapInfo;
HGLOBAL m_hDIB;

void Init()
{
m_pRGBQuad = NULL; //RGBQUAD 表项
m_pDibData = NULL; //位图像素数据
m_nWidth = 0; //宽度
m_nHeight = 0; //高度
m_nBitCount = 0; //每个像素占有的位数
m_nTotalColors = 0; //颜色总数
m_pBitmapFileHeader = NULL;
m_pBitmapInfoHeader = NULL;
m_pBitmapInfo = NULL;
m_hDIB = 0;
m_pszFileName = NULL;
}

DWORD GetDibWidthBytes(int nWidth, BYTE byBitCount)
{
DWORD dwWidthBytes = (DWORD)nWidth; //8-bits
if(byBitCount == 1) dwWidthBytes = (nWidth + 7) / 8;
else if(byBitCount == 4) dwWidthBytes = (nWidth + 1) / 2;
else if(byBitCount == 24) dwWidthBytes = 3 * nWidth ;

while((dwWidthBytes & 3) != 0)dwWidthBytes++;

return dwWidthBytes;
}

DWORD GetSize()
{
if (m_pBitmapInfoHeader->biSizeImage != 0)
return (m_pBitmapInfoHeader->biSizeImage);
else
return (DWORD)GetDibWidthBytes(m_nWidth, 24) * (DWORD)m_nHeight;
}

UINT GetColorNumber() const
{
UINT nColors = 0;

if ((m_pBitmapInfoHeader->biClrUsed == 0) &&
(m_pBitmapInfoHeader->biBitCount < 9))
{
switch (m_pBitmapInfoHeader->biBitCount)
{
case 1: nColors = 2; break;
case 4: nColors = 16; break;
case 8: nColors = 256;break;
}
}
else
nColors = (UINT) m_pBitmapInfoHeader->biClrUsed;

return nColors;
}

void LoadFile(const char* pszDibFileName)
{
ASSERT(pszDibFileName);
//如果存在就释放内存
if(m_pBitmapInfo) ::GlobalFree(m_hDIB);
//再次初始化, 用于多次动态重用
Init();
m_pszFileName = (char*)pszDibFileName;

BITMAPFILEHEADER bitmapFileHeader;

CFile dibFile(pszDibFileName, CFile::modeRead);
try
{
//读入位图文件头信息
UINT nBFHsize = dibFile.Read((void*)&bitmapFileHeader, sizeof(BITMAPFILEHEADER));
if(nBFHsize != sizeof(BITMAPFILEHEADER))
{
m_bValid = FALSE;
return;
}
}
catch(CFileException* e)
{
e->Delete();
}

//如果为位图就进行下一步的处理
if (bitmapFileHeader.bfType == 0x4d42)
{
AfxGetApp()->BeginWaitCursor();

//文件长度
DWORD dwFileLength = dibFile.GetLength();

//位图信息及位图数据的大小(字节)
DWORD dwSize = dwFileLength - sizeof(BITMAPFILEHEADER);


//为Dib分配全局内存
m_hDIB = (HGLOBAL) ::GlobalAlloc(GMEM_MOVEABLE, dwSize);
if (m_hDIB == 0) m_bValid = FALSE;

//指向Dib实际像素数据的指针,
BYTE* pbyDib = (BYTE*)::GlobalLock(m_hDIB);
if (pbyDib == NULL) m_bValid = FALSE;

try
{
//读入内存
DWORD dwReadSize = dibFile.Read((void*)pbyDib, dwSize);
dibFile.Close();
if(dwReadSize != dwSize)
{
m_bValid = FALSE;
::GlobalUnlock(m_hDIB);
::GlobalFree(m_hDIB);
Init();
return;
}
}
catch(CFileException* e)
{
e->Delete();
}

//获取位图文件头指针和位图文件数据信息指针
m_pBitmapInfo = (BITMAPINFO*) pbyDib;
m_pBitmapInfoHeader = (BITMAPINFOHEADER*) pbyDib;

//宽度和高度
m_nWidth = m_pBitmapInfoHeader->biWidth;
m_nHeight = m_pBitmapInfoHeader->biHeight;
//每像素的颜色位数
m_nBitCount = (BYTE)m_pBitmapInfoHeader->biBitCount;
//只处理双色位图
if(m_nBitCount != 1)
return;
//颜色数
m_nTotalColors = GetColorNumber();
if (m_pBitmapInfoHeader->biClrUsed == 0)
m_pBitmapInfoHeader->biClrUsed = m_nTotalColors;

//指向位图颜色索引表项的指针, 如果没有颜色表项, 则该值为NULL
m_pRGBQuad = (RGBQUAD*)(pbyDib + m_pBitmapInfoHeader->biSize);

//颜色索引表的大小(字节)
DWORD dwColorTableSize = m_nTotalColors * sizeof(RGBQUAD);

//指向位图数据的指针
m_pDibData = pbyDib + m_pBitmapInfoHeader->biSize + dwColorTableSize;

//如果没有颜色索引表, 则该值为NULL
if (m_pRGBQuad == (RGBQUAD*)m_pDibData) m_pRGBQuad = NULL;

//位图的大小(面积像素单位)
m_pBitmapInfoHeader->biSizeImage = GetSize();
::GlobalUnlock(m_hDIB);
m_bValid = TRUE;
}
else
{
AfxMessageBox("This is not a bitmap file!");
m_bValid = FALSE;
}
}


//说明:以上函数均来自向世明CDib类,仅作少量修改。
//这部分代码其实大家基本都是相同的,我就不再重复写了,奉行了拿来主义
BOOL GetDdbData(const char* pFileName, unsinged char* pOutData)
{
///读入数据
LoadFile(pFileName);
if(!m_bValid)
return FALSE;
//每行实际字节数, 8个像素对应一个字节.
LONG nLineBytes = (m_nWidth + 7) / 8;
BYTE byBitMask[] = {0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01};
//这里按原顺序(左下到右上)复制,也可以按正序复制(左上到右下)
//就不做尺寸检查了,省事:)
for(int nH = 0; nH < m_nHeight; nH++)
{
for(int nW = 0; nW < nLineBytes; nW++)
{
//取各个位的像素值
unsinged char tmpBit = *(m_pDibData+nH*dwLineBytes+nW);
unsinged char* pTarget = pOutData+nH*LineBytes+nW;
for(int n = 0; n < 8; n++)
{
//从高到低取各个位的值
unsinged char tmp = (tmpBit&byBitMask[n])>>(7-n);
//将颜色索引表中对应的值赋给目标内存
*pTarget = ((*pTarget)&(m_pRGBQuad[tmp]<<(7-n)));
}
}
}
///释放临时分配的内存,可以用new-〉delete代替
if(m_hDIB != NULL)
::GlobalFree(m_hDIB);
return TRUE;

}

我可能没理解清你的意思或者你不知道当一个双色位图保存到硬盘上是就已经经过“压缩”了?
对你的意思的另一种理解是传进来一个1600*200的数组要求保存到另一个200*200的数组中。如果是这样的话,就更简单了,只需要下面这个函数就够了:
BOOL TransData(const char* pInData, unsinged char* pOutData, int nW/*=1600*/, int nH/*=200*/, int nColorNum/*=1*/)
{
//不再做合法性检查
//每行实际字节数, 8个像素对应一个字节.
LONG nLineBytes = (nW + 7) / 8;
for(int i = 0; i < nH; i++)
{
for(int j = 0; j < nLineBytes; j++)
{
if((j+1)/8 == 0)
pOutData++;
(*pOutData) = (*pOutData)&((*pInData+i*nLineBytes+j)<<(7-(j%8)));
}
}
}
bluebohe 2003-11-22
  • 打赏
  • 举报
回复
我所作的主要的东西就是往800*200数组中存数据啊。其实我想他考你的主要是两点连线的做法,我画图的那些代码仅仅是验证作用,不然我怎么知道我存的数据无误啊,附加代码而已,void DrawLine(int x1,int y1,int x2,int y2);和void DrawPixel(int x,int y);两个函数基本实现了你的功能。
而山上人根本没有实现按位存放的要求
加载更多回复(13)

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧