青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆:78 文章:7 評(píng)論:38 引用:0
C++博客 首頁(yè) 發(fā)新隨筆
發(fā)新文章 聯(lián)系 聚合管理

轉(zhuǎn)自:http://blog.sina.com.cn/s/blog_4d035b080100k3ep.html?retcode=0
opengl文字處理(1) (入門學(xué)習(xí)十六)(轉(zhuǎn))

OpenGL
版的“Hello, World!”
寫完了本課,我的感受是:顯示文字很簡(jiǎn)單,顯示文字很復(fù)雜。看似簡(jiǎn)單的功能,背后卻隱藏了深不可測(cè)的玄機(jī)。
呵呵,別一開(kāi)始就被嚇住了,讓我們先從“Hello, World!”開(kāi)始。
前面已經(jīng)說(shuō)過(guò)了,要顯示字符,就需要通過(guò)操作系統(tǒng),把繪制字符的動(dòng)作裝到顯示列表中,然后我們調(diào)用顯示列表即可繪制字符。
假如我們要顯示的文字全部是ASCII字符,則總共只有0127128種可能,因此可以預(yù)先把所有的字符分別裝到對(duì)應(yīng)的顯示列表中,然后在需要時(shí)調(diào)用這些顯示列表。
Windows系統(tǒng)中,可以使用wglUseFontBitmaps函數(shù)來(lái)批量的產(chǎn)生顯示字符用的顯示列表。函數(shù)有四個(gè)參數(shù):
第一個(gè)參數(shù)是HDC,學(xué)過(guò)Windows GDI的朋友應(yīng)該會(huì)熟悉這個(gè)。如果沒(méi)有學(xué)過(guò),那也沒(méi)關(guān)系,只要知道調(diào)用wglGetCurrentDC函數(shù),就可以得到一個(gè)HDC了。具體的情況可以看下面的代碼。
第二個(gè)參數(shù)表示第一個(gè)要產(chǎn)生的字符,因?yàn)槲覀円a(chǎn)生0127的字符的顯示列表,所以這里填0
第三個(gè)參數(shù)表示要產(chǎn)生字符的總個(gè)數(shù),因?yàn)槲覀円a(chǎn)生0127的字符的顯示列表,總共有128個(gè)字符,所以這里填128
第四個(gè)參數(shù)表示第一個(gè)字符所對(duì)應(yīng)顯示列表的編號(hào)。假如這里填1000,則第一個(gè)字符的繪制命令將被裝到第1000號(hào)顯示列表,第二個(gè)字符的繪制命令將被裝到第1001號(hào)顯示列表,依次類推。我們可以先用glGenLists申請(qǐng)128個(gè)連續(xù)的顯示列表編號(hào),然后把第一個(gè)顯示列表編號(hào)填在這里。
還要說(shuō)明一下,因?yàn)?font style="LINE-HEIGHT: 21px; WORD-WRAP: normal; WORD-BREAK: normal" face="Times New Roman">wglUseFontBitmaps是Windows系統(tǒng)特有的函數(shù),所以在使用前需要加入頭文件:#include <windows.h>
現(xiàn)在讓我們來(lái)看具體的代碼:

#include <windows.h>

// ASCII
字符總共只有0127,一共128種字符
#define MAX_CHAR       128

void drawString(const char* str) {
    static int isFirstCall 1;
    static GLuint lists;

    if( isFirstCall // 
如果是第一次調(diào)用,執(zhí)行初始化
                        // 為每一個(gè)ASCII字符產(chǎn)生一個(gè)顯示列表
        isFirstCall 0;

        // 
申請(qǐng)MAX_CHAR個(gè)連續(xù)的顯示列表編號(hào)
        lists glGenLists(MAX_CHAR);

        // 
把每個(gè)字符的繪制命令都裝到對(duì)應(yīng)的顯示列表中
        wglUseFontBitmaps(wglGetCurrentDC(), 0, MAX_CHAR, lists);
    }
    // 
調(diào)用每個(gè)字符對(duì)應(yīng)的顯示列表,繪制每個(gè)字符
    for(; *str!='\0'; ++str)
        glCallList(lists *str);
}



顯示列表一旦產(chǎn)生就一直存在(除非調(diào)用glDeleteLists銷毀),所以我們只需要在第一次調(diào)用的時(shí)候初始化,以后就可以很方便的調(diào)用這些顯示列表來(lái)繪制字符了。
繪制字符的時(shí)候,可以先用glColor*等指定顏色,然后用glRasterPos*指定位置,最后調(diào)用顯示列表來(lái)繪制。

void display(void) {
    glClear(GL_COLOR_BUFFER_BIT);

    glColor3f(1.0f, 0.0f, 0.0f);
    glRasterPos2f(0.0f, 0.0f);
    drawString("Hello, World!");

    glutSwapBuffers();
}

效果如圖:



指定字體
在產(chǎn)生顯示列表前,Windows允許選擇字體。
我做了一個(gè)selectFont函數(shù)來(lái)實(shí)現(xiàn)它,大家可以看看代碼。

void selectFont(int size, int charset, const char* face) {
    HFONT hFont CreateFontA(size, 0, 0, 0, FW_MEDIUM, 0, 0, 0,
        charset, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
        DEFAULT_QUALITY, DEFAULT_PITCH FF_SWISS, face);
    HFONT hOldFont (HFONT)SelectObject(wglGetCurrentDC(), hFont);
    DeleteObject(hOldFont);
}

void display(void) {
    selectFont(48, ANSI_CHARSET, "Comic Sans MS");

    glClear(GL_COLOR_BUFFER_BIT);

    glColor3f(1.0f, 0.0f, 0.0f);
    glRasterPos2f(0.0f, 0.0f);
    drawString("Hello, World!");

    glutSwapBuffers();
}


最主要的部分就在于那個(gè)參數(shù)超多的CreateFont函數(shù),學(xué)過(guò)Windows GDI的朋友應(yīng)該不會(huì)陌生。沒(méi)有學(xué)過(guò)GDI的朋友,有興趣的話可以自己翻翻MSDN文檔。這里我并不準(zhǔn)備仔細(xì)講這些參數(shù)了,下面的內(nèi)容還多著呢:(
如果需要在自己的程序中選擇字體的話,把selectFont函數(shù)抄下來(lái),在調(diào)用glutCreateWindow之后、在調(diào)用wglUseFontBitmaps之前使用selectFont函數(shù)即可指定字體。函數(shù)的三個(gè)參數(shù)分別表示了字體大小、字符集(英文字體可以用ANSI_CHARSET,簡(jiǎn)體中文字體可以用GB2312_CHARSET,繁體中文字體可以用CHINESEBIG5_CHARSET,對(duì)于中文的Windows系統(tǒng),也可以直接用DEFAULT_CHARSET表示默認(rèn)字符集)、字體名稱。
效果如圖:



 

posted @ 2010-11-14 21:36 未央 閱讀(721) | 評(píng)論 (0)編輯 收藏
 

轉(zhuǎn)載:http://blog.csdn.net/xie_zi/archive/2007/12/09/1925778.aspx
GLUT教程              鼠標(biāo)
在前幾節(jié),我們看了怎么使用GLUT的keyboard函數(shù),來(lái)增加一個(gè)OpenGL程序的交互性。現(xiàn)在,是時(shí)候研究下鼠標(biāo)了。GLUT的鼠標(biāo)接口提供一些列的選項(xiàng)來(lái)增加鼠標(biāo)的交互性。也就是檢測(cè)鼠標(biāo)單擊,和鼠標(biāo)移動(dòng)。
 
檢測(cè)鼠標(biāo)Clicks
和鍵盤處理一樣,GLUT為你的注冊(cè)函數(shù)(也就是處理鼠標(biāo)clicks事件的函數(shù))提供了一個(gè)方法。函數(shù)glutMouseFunc,這個(gè)函數(shù)一般在程序初始化階段被調(diào)用。函數(shù)原型如下:
void glutMouseFunc(void(*func)(int button,int state,int x,int y));
參數(shù):
func:處理鼠標(biāo)click事件的函數(shù)的函數(shù)名。
從上面可以看到到,處理鼠標(biāo)click事件的函數(shù),一定有4個(gè)參數(shù)。第一個(gè)參數(shù)表明哪個(gè)鼠標(biāo)鍵被按下或松開(kāi),這個(gè)變量可以是下面的三個(gè)值中的一個(gè):
GLUT_LEFT_BUTTON
GLUT_MIDDLE_BUTTON
GLUT_RIGHT_BUTTON
第二個(gè)參數(shù)表明,函數(shù)被調(diào)用發(fā)生時(shí),鼠標(biāo)的狀態(tài),也就是是被按下,或松開(kāi),可能取值如下:
GLUT_DOWN
GLUT_UP
當(dāng)函數(shù)被調(diào)用時(shí),state的值是GLUT_DOWN,那么程序可能會(huì)假定將會(huì)有個(gè)GLUT_UP事件,甚至鼠標(biāo)移動(dòng)到窗口外面,也如此。然而,如果程序調(diào)用glutMouseFunc傳遞NULL作為參數(shù),那么GLUT將不會(huì)改變鼠標(biāo)的狀態(tài)。
 
剩下的兩個(gè)參數(shù)(x,y)提供了鼠標(biāo)當(dāng)前的窗口坐標(biāo)(以左上角為原點(diǎn))。
 
檢測(cè)動(dòng)作(motion)
GLUT提供鼠標(biāo)motion檢測(cè)能力。有兩種GLUT處理的motion:active motion和passive motion。Active motion是指鼠標(biāo)移動(dòng)并且有一個(gè)鼠標(biāo)鍵被按下。Passive motion是指當(dāng)鼠標(biāo)移動(dòng)時(shí),并有沒(méi)鼠標(biāo)鍵按下。如果一個(gè)程序正在追蹤鼠標(biāo),那么鼠標(biāo)移動(dòng)期間,沒(méi)一幀將產(chǎn)生一個(gè)結(jié)果。
 
和以前一樣,你必須注冊(cè)將處理鼠標(biāo)事件的函數(shù)(定義函數(shù))。GLUT讓我們可以指定兩個(gè)不同的函數(shù),一個(gè)追蹤passive motion,另一個(gè)追蹤active motion
 
它們的函數(shù)原型,如下:
void glutMotionFunc(void(*func)(int x,int y));
void glutPassiveMotionFunc(void (*func)(int x,int y));
參數(shù):
Func:處理各自類型motion的函數(shù)名。
處理motion的參數(shù)函數(shù)的參數(shù)(x,y)是鼠標(biāo)在窗口的坐標(biāo)。以左上角為原點(diǎn)。
 
檢測(cè)鼠標(biāo)進(jìn)入或離開(kāi)窗口
GLUT還能檢測(cè)鼠標(biāo)鼠標(biāo)離開(kāi),進(jìn)入窗口區(qū)域。一個(gè)回調(diào)函數(shù)可以被定義去處理這兩個(gè)事件。GLUT里,調(diào)用這個(gè)函數(shù)的是glutEntryFunc,函數(shù)原型如下:
void glutEntryFunc(void(*func)(int state));
參數(shù):
Func:處理這些事件的函數(shù)名。
上面函數(shù)的參數(shù)中,state有兩個(gè)值:
GLUT_LEFT
GLUT_ENTERED
表明,是離開(kāi),還是進(jìn)入窗口。
 
把它們放一起
首先我們要做的是在GLUT里定義哪些函數(shù)將負(fù)責(zé)處理鼠標(biāo)事件。因此我們將重寫我們的main函數(shù),讓它包含所有必須的回調(diào)注冊(cè)函數(shù)。我們將在程序里描述其他一些教程里沒(méi)說(shuō)清楚的地方。
void main(int argc, char **argv) {         glutInit(&argc, argv);         glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);         glutInitWindowPosition(100,100);         glutInitWindowSize(320,320);         glutCreateWindow("SnowMen");         glutDisplayFunc(renderScene);         glutIdleFunc(renderScene);         glutReshapeFunc(changeSize);          //adding here the mouse processing callbacks         glutMouseFunc(processMouse);         glutMotionFunc(processMouseActiveMotion);         glutPassiveMotionFunc(processMousePassiveMotion);         glutEntryFunc(processMouseEntry);                  glutMainLoop();}OK,現(xiàn)在做點(diǎn)有趣的。我們將定義那些將做一些不可思議事件的回調(diào)函數(shù)。當(dāng)一個(gè)鼠標(biāo)鍵和alt鍵都被按下,我們將改變?nèi)切蔚念伾J髽?biāo)左鍵使三角形變成紅色,中間的將三角形變成綠色,鼠標(biāo)右鍵將三角形變成藍(lán)色。函數(shù)如下:
void processMouse(int button, int state, int x, int y) {           specialKey = glutGetModifiers();         // 當(dāng)鼠標(biāo)鍵和alt鍵都被按下         if ((state == GLUT_DOWN) &&                           (specialKey == GLUT_ACTIVE_ALT)) {                  // set the color to pure red for the left button                 if (button == GLUT_LEFT_BUTTON) {                          red = 1.0; green = 0.0; blue = 0.0;                 }                 // set the color to pure green for the middle button                 else if (button == GLUT_MIDDLE_BUTTON) {                          red = 0.0; green = 1.0; blue = 0.0;                 }                 // set the color to pure blue for the right button                 else {                          red = 0.0; green = 0.0; blue = 1.0;                 }         }}接下來(lái)有一個(gè)精細(xì)的顏色拾取方法。當(dāng)一個(gè)鼠標(biāo)鍵被按下,但alt鍵被被按下。我們把blue設(shè)為0.0,并且讓red和green分量的值取決于鼠標(biāo)在窗口中的位置。。函數(shù)如下:
void processMouseActiveMotion(int x, int y) {          // the ALT key was used in the previous function         if (specialKey != GLUT_ACTIVE_ALT) {                 // setting red to be relative to the mouse                  // position inside the window                 if (x < 0)                          red = 0.0;                 else if (x > width)                          red = 1.0;                 else                          red = ((float) x)/height;                 // setting green to be relative to the mouse                  // position inside the window                 if (y < 0)                          green = 0.0;                 else if (y > width)                          green = 1.0;                 else                          green = ((float) y)/height;                 // removing the blue component.                 blue = 0.0;         }}下面給passive motion添加一些動(dòng)作。當(dāng)shift鍵被按下,鼠標(biāo)將在x軸上有一個(gè)旋轉(zhuǎn)。我們不得不修改renderScene函數(shù)。函數(shù)如下:
float angleX = 0.0;...void renderScene(void) {         glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);         glPushMatrix();         glRotatef(angle,0.0,1.0,0.0);                  // This is the line we added for the         // rotation on the X axis;         glRotatef(angleX,1.0,0.0,0.0);                  glColor3f(red,green,blue);          glBegin(GL_TRIANGLES);                 glVertex3f(-0.5,-0.5,0.0);                 glVertex3f(0.5,0.0,0.0);                 glVertex3f(0.0,0.5,0.0);         glEnd();         glPopMatrix();         angle++;         glutSwapBuffers();}現(xiàn)在我們的有個(gè)函數(shù)處理passive motion事件。函數(shù)將改變angleX的值。void processMousePassiveMotion(int x, int y) {          // User must press the SHIFT key to change the          // rotation in the X axis         if (specialKey != GLUT_ACTIVE_SHIFT) {                  // setting the angle to be relative to the mouse                  // position inside the window                 if (x < 0)                          angleX = 0.0;                 else if (x > width)                          angleX = 180.0;                 else                          angleX = 180.0 * ((float) x)/height;         }}最后鼠標(biāo)離開(kāi)窗口將使動(dòng)畫停止,為了做到這,我們也需要改變函數(shù)renderScene。// initially define the increase of the angle by 1.0;float deltaAngle = 1.0;...void renderScene(void) {         glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);         glPushMatrix();         glRotatef(angle,0.0,1.0,0.0);         glRotatef(angleX,1.0,0.0,0.0);         glColor3f(red,green,blue);          glBegin(GL_TRIANGLES);                 glVertex3f(-0.5,-0.5,0.0);                 glVertex3f(0.5,0.0,0.0);                 glVertex3f(0.0,0.5,0.0);         glEnd();         glPopMatrix();         // this is the new line         // previously it was: angle++;         angle+=deltaAngle;         glutSwapBuffers();}processMouseEntry是最后一個(gè)函數(shù)。注意,這個(gè)在微軟操作系統(tǒng)下可能工作的不是很好。void processMouseEntry(int state) {         if (state == GLUT_LEFT)                 deltaAngle = 0.0;         else                 deltaAngle = 1.0;}VC6.0工程可以在這里下載(glut8.zip)。 (到這里位置,鍵盤,鼠標(biāo)方面的控制講完了,下面就是菜單了。)(原文地址:http://www.lighthouse3d.com/opengl/glut/index.php?9

本文來(lái)自CSDN博客,轉(zhuǎn)載請(qǐng)標(biāo)明出處:http://blog.csdn.net/xie_zi/archive/2007/12/09/1925778.aspx

posted @ 2010-11-08 12:26 未央 閱讀(9147) | 評(píng)論 (1)編輯 收藏
 
【轉(zhuǎn)】http://dacuisworld.spaces.live.com/blog/cns!5194FC8976D233A0!1121.entry
重裝電腦之后按照以上方法可順利配置OpenGL編程環(huán)境!重裝了真好!
posted @ 2010-11-02 14:52 未央 閱讀(313) | 評(píng)論 (0)編輯 收藏
 

在VISUAL C++ 2008上配置OPENGL開(kāi)發(fā)環(huán)境

這篇文章寫的太有用了!我想配VC2008的OpenGL,添加了5個(gè)文件后仍然找不到glaux.h,很是著急啊,直到這篇文章解救了我。  !!!非常感謝!

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
應(yīng)該在
VISUAL C++ 2005/VC 6.0/VC7.0同樣都適用

首先感謝網(wǎng)上寫VC6.0配置OPENGL開(kāi)發(fā)環(huán)境的作者,我是先在你那里學(xué)習(xí)了如何配置,只是做了一點(diǎn)小的延伸,主要內(nèi)容還是你的。

第一步:下載OpenGLGLUT庫(kù)

Windows環(huán)境下的GLUT下載地址:(蘋果機(jī)不需要安裝,自帶)  

http://www.opengl.org/resources/libraries/glut/glutdlls37beta.zip

第二步:OpenGL庫(kù)和配置文件

OpenGL庫(kù)配置用到的文件分為下面三類:

■ 動(dòng)態(tài)鏈接庫(kù)文件(.dll

glaux.dll, glu32.dll, glut32.dll, OPENGL32.DLL, glut.dll

■ 頭文件(.h

GL.H, GLAUX.H, GLU.H, glut.h

■ 庫(kù)文件(.lib

GLAUX.LIBGlu32.libglut32.libOpengl32.libglut.lib

 

其中opengl32.dll, glaux.dll,glu32.dll是安裝顯卡驅(qū)動(dòng)自帶,應(yīng)該每個(gè)系統(tǒng)里面都有,如果沒(méi)有重新安裝顯卡驅(qū)動(dòng)。

其中glut32.dll, glut.dll, glut.h, glut32.lib, glut.lib 是在剛才那個(gè)地址下載的,打開(kāi)壓縮包后會(huì)有5個(gè)文件

下面就是區(qū)別了,VC++ 2008不帶GL.H, GLAUX.h, glu.h, glaux.lib, glu32.lib, opengl32.lib這些文件要在網(wǎng)上下載或者在VC6.0里面拷貝出來(lái),

如果想要全套的文件,給我發(fā)郵件我給你發(fā)xudongcui@gmail.com

 

第三步:Windows下配置OpenGL

glut32.dll, glut.dll拷貝到C:\WINDOWS\system32目錄下,system32目錄下應(yīng)該已經(jīng)有 opengl32.dll, glu32.dll了。

GL.H, GLAUX.h, glu.h, glut.h  拷貝到 C:\Program Files\Microsoft Visual Studio 9.0\VC\include\gl

GLAUX.LIBGlu32.libglut32.libOpengl32.libglut.lib拷貝到 C:\Program Files\Microsoft Visual Studio 9.0\VC\lib

第四步:建立VC++2008工程

打開(kāi)VC++2008,選擇新建工程,Win32Win32控制臺(tái)應(yīng)用程序。刪除默認(rèn)的所有代碼,用如下代碼替換。

#include "stdafx.h"

#include <windows.h>

#include <GL/glu.h>

#include <GL/gl.h>

#include <GL/glut.h>

#include <GL/glaux.h>

 

void background(void)

{

//設(shè)置背景顏色為黑色

glClearColor(0.0,0.0,0.0,0.0);

}

 

void myDisplay(void)

{

//buffer設(shè)置為顏色可寫

glClear(GL_COLOR_BUFFER_BIT);

//開(kāi)始畫三角形

glBegin(GL_TRIANGLES);

//設(shè)置為光滑明暗模式

glShadeModel(GL_SMOOTH);

//設(shè)置第一個(gè)頂點(diǎn)為紅色

glColor3f(1.0,0.0,0.0);

//設(shè)置第一個(gè)頂點(diǎn)的坐標(biāo)為(-1.0-1.0

glVertex2f(-1.0,-1.0);

//設(shè)置第二個(gè)頂點(diǎn)為綠色

glColor3f(0.0,1.0,0.0);

//設(shè)置第二個(gè)頂點(diǎn)的坐標(biāo)為(0.0-1.0

glVertex2f(0.0,-1.0);

//設(shè)置第三個(gè)頂點(diǎn)為藍(lán)色

glColor3f(0.0,0.0,1.0);

//設(shè)置第三個(gè)頂點(diǎn)的坐標(biāo)為(-0.51.0

glVertex2f(-0.5,1.0);

//三角形結(jié)束

glEnd();

//強(qiáng)制OpenGL函數(shù)在有限時(shí)間內(nèi)運(yùn)行

glFlush();

}

 

void myReshape(GLsizei w,GLsizei h)

{

glViewport(0,0,w,h);

//設(shè)置視口

 

glMatrixMode(GL_PROJECTION);

//指明當(dāng)前矩陣為GL_PROJECTION

glLoadIdentity();

//將當(dāng)前矩陣置換為單位陣

 

if(w <= h)

gluOrtho2D(-1.0,1.5,-1.5,1.5*(GLfloat)h/(GLfloat)w);

//定義二維正視投影矩陣

else

gluOrtho2D(-1.0,1.5*(GLfloat)w/(GLfloat)h,-1.5,1.5);

glMatrixMode(GL_MODELVIEW);

//指明當(dāng)前矩陣為GL_MODELVIEW

}

int main(int argc, char* argv[])

{

// 初始化

glutInit(&argc,argv);

glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);

glutInitWindowSize(400,400);

glutInitWindowPosition(200,200);

 

//創(chuàng)建窗口

glutCreateWindow("Triangle");

 

//繪制與顯示

background();

glutReshapeFunc(myReshape);

glutDisplayFunc(myDisplay);

 

glutMainLoop();

return(0);

}

posted @ 2010-09-30 13:11 未央 閱讀(7583) | 評(píng)論 (1)編輯 收藏
 
pku 1050 最大子矩陣和

題目大意:
給定一個(gè)N*N的矩陣,求其中一個(gè)子矩陣所有元素的和最大,輸出最大值。

題解:
    這道題很早就見(jiàn)過(guò)了,一直不會(huì)做,學(xué)了最大連續(xù)和,但是沒(méi)能成功遷移,看別人的解題報(bào)告也是很久才理解。
主要思想就是把二維的矩陣轉(zhuǎn)化成一位的數(shù)字串,然后求最大子串和。轉(zhuǎn)換的時(shí)候,為了保證最大子串構(gòu)成的是完整的矩形,所以串里的每一個(gè)元素都得是一列的和。枚舉子矩陣的起始行和高度,如從第i行開(kāi)始,到第j行結(jié)束,每一對(duì) i 和 j,對(duì)每一列(1~n)求和,然后求1~n串的最大子串和。
#include<stdio.h>
#include
<string.h>
const int N = 110;
int g[N][N], f[N];
int main(){
    
int n;
    
while(scanf("%d"&n)!=EOF){
        memset(f, 
0sizeof(f));
        
for(int i=1; i<=n; i++)
            
for(int j=1; j<=n; j++)
                scanf(
"%d"&g[i][j]);
        
int mx=-100000000;
        
for(int i=1; i<=n; i++)
            
for(int j=i ; j<=n; j++){
                memset(f, 
0sizeof(f));
                
for(int s=1; s<=n; s++)
                    
for(int k=i; k<=j; k++)
                        f[s]
+=g[k][s];
                
int tmp=0;
                
for(int s=1; s<=n; s++){
                    
if(tmp>0)
                        tmp
+=f[s];
                    
else
                        tmp
=f[s];
                    mx
=mx>tmp?mx:tmp;
                }

            }

        printf(
"%d\n",mx);

    }

    
return 0;
}



posted @ 2010-09-03 22:58 未央 閱讀(216) | 評(píng)論 (0)編輯 收藏
 
         最近被逼的不行了,所以動(dòng)真格的學(xué)動(dòng)規(guī)!先是把《程序設(shè)計(jì)導(dǎo)引及在線實(shí)踐》這本書里動(dòng)規(guī)的例題都看過(guò)、做過(guò),本來(lái)想一道一道的做習(xí)題的,結(jié)果poj掛了。于是轉(zhuǎn)戰(zhàn)hdu,昨天做了一道三維樹(shù)狀數(shù)組,比較理解了,今天又繼續(xù)hdu的動(dòng)規(guī),感覺(jué)做過(guò)的題型,換個(gè)背景再做能夠想到并且實(shí)現(xiàn)了,細(xì)節(jié)上還需注意。
hdu 1160 FatMouse's Speed
題目大意:
給定n只老鼠的體重w和速度s,求一個(gè)最長(zhǎng)的排列,使得這個(gè)排列中的老鼠體重嚴(yán)格遞增,速度嚴(yán)格遞減。題目看上去很像最長(zhǎng)上升子序列,只是這里的序列是可以打亂順序按體重排序的。

解題思路:
整體思路同最長(zhǎng)上升子序列。
1、按老鼠的體重遞增排序,當(dāng)老鼠的體重相等時(shí)按速度遞減排序。
2、f[j]表示前j只老鼠中最長(zhǎng)序列的長(zhǎng)度,狀態(tài)轉(zhuǎn)移方程為
      f[N]初始值為0;
      f[j]=max{ f[i] : 0<=i<j 且 s[j]<s[i] }+1;
      也就是說(shuō),如果第j只老鼠是最長(zhǎng)序列中的話,那么它肯定比上一個(gè)在最長(zhǎng)序列中老鼠體重更大 ( j>i ) 且速度更小 ( s[j] < s[i] )。

代碼如下:
#include<stdio.h>
#include
<string.h>
#include
<algorithm>
#include
<stdlib.h>
using namespace std;
const int N = 1010;
struct Mouse{
    
int w, s, num;
}
m[N];
int f[N], pre[N];
bool cmp(Mouse a, Mouse b){
    
if(a.w<b.w)
        
return true;
    
else if (a.w==b.w)
        
return a.s>b.s;
    
return false;
}

int main(){
    
int i=0,n=0;
    
while(scanf("%d %d"&m[n].w, &m[n].s)!=EOF){
        m[n].num
=n+1;
        n
++;
    }

    sort(m, m
+n, cmp);
    memset(f, 
0sizeof(f));
    memset(pre, 
-1sizeof(pre));
    
int mx=0,end=0;
    
for(i=1; i<n; i++){
        
for(int j=0; j<i; j++){
            
if(m[i].s<m[j].s && m[i].w>m[j].w){
                
if(f[j]+1>f[i]){
                    f[i]
=f[j]+1;
                    pre[i]
=j;
                }

            }

        }

        
if(f[i]>mx){
            mx
=f[i];
            end
=i;
        }

    }

    printf(
"%d\n", mx+1);
    
int ans[N], len=0, x;
    x
=end; ans[0]=x;
    
while(pre[x]>=0){
        ans[
++len]=pre[x];
        x
=pre[x];
        
if(x<0break;
    }

    
for(i=len; i>=0; i--)
        printf(
"%d\n", m[ans[i]].num);
    
return 0;
}

posted @ 2010-09-01 17:39 未央 閱讀(198) | 評(píng)論 (0)編輯 收藏
 
Java課留作業(yè),要求實(shí)現(xiàn)“在Frame窗口中設(shè)計(jì)一個(gè)文本框和一個(gè)文本區(qū)域,文本框內(nèi)容改變時(shí),將文本框中的內(nèi)容顯示在文本區(qū)域中”,這個(gè)問(wèn)題可害苦了我,查了好多方法都不行,還是對(duì)Java里面的類不了解啊。
解決辦法:
創(chuàng)建文本框時(shí)不要用JTextField, 因?yàn)檫@個(gè)類里面沒(méi)有addTextListener的方法,所以聲明文本框的時(shí)候應(yīng)該這樣寫:
    java.awt.TextField textField=new java.awt.TextField();  
然后再給 textField 加一個(gè)監(jiān)聽(tīng)器
    textField.addTextListener(new TextListener(){
            public void textValueChanged(TextEvent e){
                ta.setText(textField.getText());
            }
        });
就可以實(shí)時(shí)在文本域里顯示文本框的改變了。
⊙﹏⊙b汗,這個(gè)問(wèn)題糾結(jié)了好久
感謝koy師兄的鼎力支持和耐心講解,好人啊!

posted @ 2010-05-23 17:27 未央 閱讀(3470) | 評(píng)論 (1)編輯 收藏
 
        現(xiàn)在才做這個(gè)決定其實(shí)已經(jīng)有些晚了,但是人就是這樣,可以早作打算的時(shí)候往往不知道該怎么打算,好在我習(xí)慣了很多事情都在最后時(shí)刻奮力爭(zhēng)取。過(guò)年這些天很多人都對(duì)我媽說(shuō),該讓孩子出去見(jiàn)識(shí)見(jiàn)識(shí),別攔著。媽媽也想開(kāi)了,有了她的支持比任何利益誘惑都更能堅(jiān)定我。于是我想給自己找一個(gè)不得不出國(guó)的理由,然后堅(jiān)定信念去拼最后半年,但是我發(fā)現(xiàn)這個(gè)理由好難找,后來(lái)我知道了,很多事情之所以這樣做并不一定是出于必然,而是個(gè)人的喜好和性格,這樣的話,選擇就無(wú)所謂對(duì)錯(cuò),只有喜歡與否。就像選專業(yè)一樣,選到喜歡的就是對(duì)的。好吧,那就讓自己離開(kāi)家吧,像去杭州和哈爾濱一樣,下了火車沒(méi)感覺(jué)有多遠(yuǎn),照樣是人們生活的地方。
        我的學(xué)分也漸漸上來(lái)了,競(jìng)賽也有了一些成果,接下來(lái)該做的事情就是考英語(yǔ)的G、T和完成實(shí)驗(yàn)室Vuze的項(xiàng)目,最好能發(fā)一篇論文,保持成績(jī)和競(jìng)賽。時(shí)間緊,任務(wù)重,沒(méi)有心思想別的了,努力吧:)
       新年新愿望:明年的這個(gè)時(shí)候希望有好的offer圓了我的留學(xué)夢(mèng)^-^
posted @ 2010-02-25 10:28 未央 閱讀(357) | 評(píng)論 (1)編輯 收藏
 
包含點(diǎn)集所有點(diǎn)的最小圓的算法最小圓覆蓋 http://acm.zju.edu.cn/show_problem.php?pid=1450 相關(guān)題目最小球包含 http://acm.pku.edu.cn/JudgeOnline/problem?id=2069 平面上有n個(gè)點(diǎn),給定n個(gè)點(diǎn)的坐標(biāo),試找一個(gè)半徑最小的圓,將n 個(gè)點(diǎn)全部包圍,點(diǎn)可以在圓上。 1. 在點(diǎn)集中任取3點(diǎn)A,B,C。 2. 作一個(gè)包含A,B,C三點(diǎn)的最小圓,圓周可能通過(guò)這3點(diǎn),也可能只通過(guò)其中兩點(diǎn),但包含第3點(diǎn).后一種情況圓周上的兩點(diǎn)一定是位于圓的一條直徑的兩端。 3. 在點(diǎn)集中找出距離第2步所建圓圓心最遠(yuǎn)的D點(diǎn),若D點(diǎn)已在圓內(nèi)或圓周上,則該圓即為所求的圓,算法結(jié)束.則,執(zhí)行第4步。 4. 在A,B,C,D中選3個(gè)點(diǎn),使由它們生成的一個(gè)包含這4個(gè)點(diǎn)的圓為最小,這3 點(diǎn)成為新的A,B,C,返回執(zhí)行第2步。若在第4步生成的圓的圓周只通過(guò)A,B,C,D 中的兩點(diǎn),則圓周上的兩點(diǎn)取成新的A和B,從另兩點(diǎn)中任取一點(diǎn)作為新的C。 程序設(shè)計(jì)題解上的解題報(bào)告:對(duì)于一個(gè)給定的點(diǎn)集A,記MinCircle(A)為點(diǎn)集A的最小外接圓,顯然,對(duì)于所有的點(diǎn)集情況A,MinCircle(A)都是存在且惟一的。需要特別說(shuō)明的是,當(dāng)A為空集時(shí),MinCircle(A)為空集,當(dāng)A={a}時(shí),MinCircle(A)圓心坐標(biāo)為a,半徑為0; 顯然,MinCircle(A)可以有A邊界上最多三個(gè)點(diǎn)確定(當(dāng)點(diǎn)集A中點(diǎn)的個(gè)數(shù)大于 1時(shí),有可能兩個(gè)點(diǎn)確定了MinCircle(A)),也就是說(shuō)存在著一個(gè)點(diǎn)集B,|B|<=3 且B包含與A,有MinCircle(B)=MinCircle(A).所以,如果a不屬于B,則 MinCircle(A-{a})=MinCircle(A);如果MinCircle(A-{a})不等于MinCircle(A),則 a屬于B。 所以我們可以從一個(gè)空集R開(kāi)始,不斷的把題目中給定的點(diǎn)集中的點(diǎn)加入R,同時(shí)維護(hù)R的外接圓最小,這樣就可以得到解決該題的算法。
zju 1450
題目描述:給定n個(gè)點(diǎn),求覆蓋所有點(diǎn)的圓的圓心和半徑
#include<stdio.h>
#include
<math.h>
#include
<string.h>
#define MAXN 20
struct pointset{
    
double x, y;
};
const double precison=1.0e-8;
pointset maxcic, point[MAXN];
double radius;
int curset[MAXN], posset[3];
int set_cnt, pos_cnt;
inline 
double dis_2(pointset &from, pointset& to){
    
return ((from.x-to.x)*(from.x-to.x)+(from.y-to.y)*(from.y-to.y));
}
int in_cic(int pt){
    
if(sqrt(dis_2(maxcic, point[pt]))<radius+precison) return 1;
    
return 0;
}
int cal_mincic(){
    
if(pos_cnt==1 || pos_cnt==0)
        
return 0;
    
else if(pos_cnt==3){
        
double A1, B1, C1, A2, B2, C2;
        
int t0=posset[0], t1=posset[1], t2=posset[2];
        A1
=2*(point[t1].x-point[t0].x);
        B1
=2*(point[t1].y-point[t0].y);
        C1
=point[t1].x*point[t1].x-point[t0].x*point[t0].x+
            point[t1].y
*point[t1].y-point[t0].y*point[t0].y;
        A2
=2*(point[t2].x-point[t0].x);
        B2
=2*(point[t2].y-point[t0].y);
        C2
=point[t2].x*point[t2].x-point[t0].x*point[t0].x+
            point[t2].y
*point[t2].y-point[t0].y*point[t0].y;
        maxcic.y
=(C1*A2-C2*A1)/(A2*B1-A1*B2);
        maxcic.x
=(C1*B2-C2*B1)/(A1*B2-A2*B1);
        radius
=sqrt(dis_2(maxcic, point[t0]));
    }
    
else if(pos_cnt==2){
        maxcic.x
=(point[posset[0]].x+point[posset[1]].x)/2;
        maxcic.y
=(point[posset[0]].y+point[posset[1]].y)/2;
        radius
=sqrt(dis_2(point[posset[0]], point[posset[1]]))/2;
    }
    
return 1;
}
int mindisk(){
    
if(set_cnt==0 || pos_cnt==3){
        
return cal_mincic();
    }
    
int tt=curset[--set_cnt];
    
int res=mindisk();
    set_cnt
++;
    
if(!res || !in_cic(tt)){
        set_cnt
--;
        posset[pos_cnt
++]=curset[set_cnt];
        res
=mindisk();
        pos_cnt
--;
        curset[set_cnt
++]=curset[0];
        curset[
0]=tt;
    }
    
return res;
}
int main(){
    freopen(
"in2.txt""r", stdin);
    freopen(
"radius.txt""w", stdout);
    
int n;
    
while(scanf("%d"&n)!=EOF){
        
if(n==0break;
        
int i;
        
for(i=0; i<n; i++)
            scanf(
"%lf %lf"&point[i].x, &point[i].y);
            
if(n==1){
                maxcic.x
=point[0].x;
                maxcic.y
=point[0].y;
                radius
=0;
                printf(
"%.2lf %.2lf %.2lf\n", maxcic.x, maxcic.y, radius);
                
continue;
            }
            set_cnt
=n; pos_cnt=0;
            
for(i=0 ;i<n ;i++)  curset[i]=i;
            mindisk();
            printf(
"%.2lf %.2lf %.2lf\n", maxcic.x, maxcic.y, radius);
    }

    
return 0;
}
posted @ 2010-02-21 12:03 未央 閱讀(4264) | 評(píng)論 (5)編輯 收藏
 

一個(gè)標(biāo)準(zhǔn)的Joseph問(wèn)題,n個(gè)人(編號(hào)0~(n-1)),從0開(kāi)始報(bào)數(shù),報(bào)到(m-1)的退出,剩下的人繼續(xù)從0開(kāi)始報(bào)數(shù)。求勝利者的編號(hào)。
我們知道第一個(gè)人(編號(hào)一定是m%n-1) 出列之后,剩下的n-1個(gè)人組成了一個(gè)新的約瑟夫環(huán)(以編號(hào)為k=m%n的人開(kāi)始):
   k   k+1   k+2   ... n-2, n-1, 0, 1, 2, ... k-2
并且從k開(kāi)始報(bào)0。

現(xiàn)在我們把他們的編號(hào)做一下轉(zhuǎn)換:
k      --> 0
k+1    --> 1
k+2    --> 2
...
...
k-2    --> n-2
k-1    --> n-1

變換后就完完全全成為了(n-1)個(gè)人報(bào)數(shù)的子問(wèn)題,假如我們知道這個(gè)子問(wèn)題的解:例如x是最終的勝利者,那么根據(jù)上面這個(gè)表把這個(gè)x變回去不剛好就是n個(gè)人情況的解嗎?!!變回去的公式很簡(jiǎn)單,相信大家都可以推出來(lái):x'=(x+k)%n

如何知道(n-1)個(gè)人報(bào)數(shù)的問(wèn)題的解?對(duì),只要知道(n-2)個(gè)人的解就行了。(n-2)個(gè)人的解呢?當(dāng)然是先求(n-3)的情況 ---- 這顯然就是一個(gè)倒推問(wèn)題!好了,思路出來(lái)了,下面寫遞推公式:

令f表示i個(gè)人玩游戲報(bào)m退出最后勝利者的編號(hào),最后的結(jié)果自然是f[n]

遞推公式
f[1]=0;
f[i]=(f[i-1]+m)%i;   (i>1)


有了這個(gè)公式,我們要做的就是從1-n順序算出f的數(shù)值,最后結(jié)果是f[n]。因?yàn)閷?shí)際生活中編號(hào)總是從1開(kāi)始,我們輸出f[n]+1

由于是逐級(jí)遞推,不需要保存每個(gè)f,程序也比較簡(jiǎn)單:

 

#include <stdio.h>
int main ()
{
int n,m,i,s;
while (scanf("%d %d",&n,&m)!=EOF)
{
   
if (n==0 && m==0return 0;
   s
=0;
   
for (i=2;i<=n;i++)
    s
=(s+m)%i;
   printf (
"%d %d %d\n",n,m,s+1);
}
return 0;
}



 

posted @ 2009-10-10 19:11 未央 閱讀(889) | 評(píng)論 (0)編輯 收藏
僅列出標(biāo)題
共8頁(yè): 1 2 3 4 5 6 7 8 
CALENDER
<2025年9月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

常用鏈接

留言簿(6)

隨筆檔案

文章檔案

搜索

  •  

最新評(píng)論

閱讀排行榜

評(píng)論排行榜


Powered By: 博客園
模板提供滬江博客

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国产精品视频不卡| 亚洲欧美日韩在线观看a三区| 国产精品视频免费| 欧美一级播放| 久久精品成人| 欧美成va人片在线观看| 一区二区三区产品免费精品久久75| 亚洲国产二区| 欧美不卡视频| 欧美日韩国产91| 亚洲二区三区四区| 欧美在线播放高清精品| 亚洲欧美日韩中文视频| 欧美日韩亚洲一区二区| 亚洲精品国产拍免费91在线| 亚洲二区在线视频| 欧美诱惑福利视频| 亚洲国产精品成人精品| 久久精品91久久久久久再现| 久久久久久综合网天天| 伊人夜夜躁av伊人久久| 欧美jizz19性欧美| av成人免费在线观看| 欧美在线视频在线播放完整版免费观看 | 国产一区二区三区在线观看网站 | 欧美日韩视频在线一区二区观看视频| 最新日韩中文字幕| 亚洲最快最全在线视频| 亚洲国产一二三| 欧美超级免费视 在线| 亚洲国产一区二区视频| 亚洲在线观看免费视频| 亚洲黄色免费电影| 国产精品素人视频| 久热精品在线视频| 国产亚洲aⅴaaaaaa毛片| 亚洲激情欧美| 国产一区二区三区的电影| 日韩视频久久| 亚洲午夜羞羞片| 亚洲激情一区二区| 久久久国产午夜精品| 欧美一区免费| 国产麻豆91精品| 欧美中文日韩| 欧美激情一区| 亚洲精品欧美激情| 国产精品久久久久久久久借妻| 午夜精品区一区二区三| 欧美成人一区二区在线 | 亚洲久久在线| 国产麻豆91精品| 蜜桃av一区二区| 亚洲人永久免费| 欧美成人免费va影院高清| 亚洲自拍偷拍麻豆| 黄色在线一区| 国产伦精品一区二区三区免费迷| 久久久久.com| 亚洲午夜精品17c| 欧美成年人视频网站欧美| 国产精品日韩一区二区| 久久视频免费观看| 久久夜色精品国产欧美乱| 这里只有精品丝袜| 99视频精品全国免费| 亚洲欧美国产不卡| 久久露脸国产精品| 牛牛精品成人免费视频| 久久全球大尺度高清视频| 亚洲免费视频观看| 欧美一级久久久| 久久精选视频| 免费在线播放第一区高清av| 免费视频一区| 欧美日本精品| 欧美日韩免费观看一区| 国产精品家庭影院| 国内精品久久久久久久97牛牛| 国内精品伊人久久久久av影院| 精品成人国产在线观看男人呻吟| 国产精品欧美激情| 韩国欧美一区| 亚洲性av在线| 久久精品视频亚洲| 亚洲黄色视屏| 亚洲欧美卡通另类91av| 蜜臀99久久精品久久久久久软件| 欧美成人免费小视频| 欧美三级视频在线观看| 亚洲精品永久免费精品| 一本色道久久88精品综合| 久久久人成影片一区二区三区 | aa国产精品| 一区二区三区精品视频| 久久综合久久综合这里只有精品 | 亚洲一本视频| 一区二区三区欧美在线观看| 国产精品乱码一区二三区小蝌蚪| 在线一区二区三区做爰视频网站| 99热在线精品观看| 国产美女精品一区二区三区| 久久精品亚洲热| 久久免费的精品国产v∧| 亚洲狼人综合| 亚洲欧美日韩精品久久亚洲区| 国产一区二区三区久久精品| 欧美电影免费观看高清完整版| 欧美成人精品不卡视频在线观看| 亚洲一区二区三区色| 欧美专区日韩视频| 亚洲天堂免费观看| 亚洲国产老妈| 欧美激情一区二区三区在线| 亚洲三级电影全部在线观看高清| 欧美成人免费网站| 欧美精品免费在线| 国产精品99久久久久久有的能看| 91久久午夜| 国产精品一卡| 老鸭窝毛片一区二区三区| 久久精品人人爽| 亚洲桃花岛网站| 午夜在线一区| 99热精品在线观看| 亚洲巨乳在线| 国产欧美日韩在线视频| 亚洲国产精品精华液网站| 欧美午夜视频网站| 久久久久免费视频| 欧美日韩精品系列| 欧美ed2k| 在线中文字幕日韩| 欧美日韩国产成人高清视频| 伊人久久大香线| 欧美一区二区视频在线| 欧美一区2区三区4区公司二百| 欧美日韩一区二区欧美激情 | 欧美日韩亚洲高清| 国产精品网站在线| 久久激情婷婷| 国产精品久久久久久久9999| 亚洲激情在线观看视频免费| 欧美日韩1234| 久久午夜av| 国产精品影片在线观看| 欧美高清在线精品一区| 国产精品美女诱惑| 最新亚洲激情| 亚洲第一页在线| 欧美一区二区在线免费播放| 在线综合+亚洲+欧美中文字幕| 久久精品一区中文字幕| 午夜视频在线观看一区| 久久亚洲欧美| 欧美一区二区三区久久精品茉莉花 | 欧美人在线视频| 亚洲第一成人在线| 狠狠色香婷婷久久亚洲精品| 亚洲一区bb| 亚洲一区影音先锋| 欧美日韩三级在线| 亚洲国产精品久久久久秋霞影院| 91久久在线观看| 亚洲免费观看在线观看| 久久久精品网| 欧美电影在线| 亚洲精品视频在线观看免费| 免费美女久久99| 亚洲精品视频一区二区三区| 亚洲人www| 国产精品久久久久77777| 这里是久久伊人| 久久精品日韩| 亚洲精品中文字幕女同| 国产精品国产三级国产aⅴ入口| 亚洲资源av| 欧美a级理论片| 亚洲一区二区三区中文字幕在线| 国产精品久久久爽爽爽麻豆色哟哟| 亚洲视频一区二区免费在线观看| 香蕉亚洲视频| 亚洲激情中文1区| 国产精品videosex极品| 久久久免费av| 亚洲欧美日韩人成在线播放| 美国三级日本三级久久99| 中国av一区| 最新日韩精品| 黄色成人av| 国产美女扒开尿口久久久| 欧美激情一区二区三区四区| 欧美一区二区网站| 亚洲自拍偷拍色片视频| 亚洲国产日韩在线一区模特| 免费看黄裸体一级大秀欧美| 亚洲黄色免费| 国语自产精品视频在线看抢先版结局| 欧美精品一二三| 欧美精品一区二区三|