當前位置:學識都>好好學習>考研>

C語言遊戲開發筆試題

學識都 人氣:2.71W

C語言的設計目標是提供一種能以簡易的方式編譯、處理低級存儲器、產生少量的機器碼以及不需要任何運行環境支持便能運行的編程語言。下面是小編蒐集的C語言遊戲開發筆試題,歡迎大家閱讀。

C語言遊戲開發筆試題

C語言遊戲開發筆試題一

1、請寫代碼打印100之內的素數,講求效率(請做你的解法的效率分析)

2、求m,n的最大公約數

3、輸入10個字符串,打印出其中重複的字符串以及重複的次數

4、請畫圖例(UML最好),給出windows下的文件目錄的設計模式

5、用OO表示狼吃羊羊吃草

問答題:

1、什麼是subversion?它與vss,cvs的區別在哪?或者有什麼優勢?

2、什麼是wiki,關於程序項目的wiki你使用過哪些?wiki對你有什麼幫助嗎?wiki與程序文擋的差別在哪?

3、什麼是tdd?你使用過嗎?tdd的關鍵在哪?跟傳統的單元測試相比,有什麼優越性?

4、什麼是單元測試?你用過哪些單元測試工具?他們的區別和好處各有哪些?你主要傾向於哪一種?

5、什麼是編程規範?你傾向於什麼樣的規範?他的好處在哪?

6、什麼是mfc?你經常使用那些mfc類?那麼爲什麼很多人不主張使用mfc?

C語言遊戲開發筆試題二

1、村子中有50個人,每人有一條狗。在這50條狗中有病狗(這種病不會傳染)。於是人們就要找出病狗。每個人可以觀察其他的49條狗,以判斷它們是否生病,只有自己的狗不能看。觀察後得到的結果不得交流,也不能通知病狗的主人。主人一旦推算出自己家的是病狗就要槍斃自己的`狗,而且每個人只有權利槍斃自己的狗,沒有權利打死其他人的狗。第一天,第二天都沒有槍響。到了第三天傳來一陣槍聲,問有幾條病狗,如何推算得出?

2、P先生、Q先生都具有足夠的推理能力。這天,他們正在接受推理面試。

他們知道桌子的抽屜裏有如下16張撲克牌:

紅桃 A、Q、4

黑桃 J、8、4、2、7、3

草花 K、Q、5、4、6

方塊 A、5

約翰教授從這16張牌中挑出一張牌來,並把這張牌的點數告訴P先生,把這張牌的花色告訴Q先生。

這時,約翰教授問P先生和Q先生:你們能從已知的點數或花色中推知這張牌是什麼牌嗎?

P先生:“我不知道這張牌。”

Q先生:“我知道你不知道這張牌。”

P先生:“現在我知道這張牌了。”

Q先生:“我也知道了。”3 樓高100層,你有2個玻璃球,在某一層n層扔下玻璃球會碎,而低於n層則玻璃球不會碎。

1)你會選擇在第幾層扔第一個玻璃球來得到最少的嘗試次數?

2)假如沒有電梯,每次都要上樓下樓,你會選擇第幾層扔第一個玻璃球來得到最短的路程(爬上爬下的樓層)?

完美世界2017C++遊戲開發筆試編程題

第一題

題意:給出一個序列a,需要找到一對位置(i, j)(j > i),使得a[j] - a[i]的值儘量大,同時i儘量大並且j儘量小,如果任意a[j] - a[i]都<=0,則輸出-1,-1。

題解:從1到n掃一遍序列處理即可,i儘量大用>=,j儘量小用>即可。

代碼:

#include

#include

using namespace std;

#define maxn (1000000)

int a[maxn], prei[maxn];

int main()

{

int n;

cin >> n;

for(int i = 0; i < n; i++)

{

scanf("%d", &a[i]);

prei[i] = -1;

}

int g = -1;

for(int i = 0; i < n; i++)

{

if(g == -1 || a[i] <= a[g]) g = i;

if(a[g] < a[i+1]) prei[i+1] = g;

}

int d = 0, o = -1;

for(int i = 1; i < n; i++) if(prei[i] != -1)

{

if(a[i] - a[prei[i]] > d)

{

d = a[i] - a[prei[i]];

o = i;

}

}

if(o == -1) cout << -1 << "," << -1 << endl;

else cout << prei[o] << "," << o << endl;

return 0;

}

第二題

題意:給出一個序列,玩家需要跟boss進行博弈,玩家先手。每次只能從序列頭或尾取一個值加到自己的得分上,玩家和boss都很聰明,求玩家和boss的最終得分。

題解:可以發現總分不是很大,可以記憶化搜索。d[i][j]表示當拿到的序列爲a[i, j]時,從中的最高得分。轉移方程是d[i][j] = max(a[i] + d[i+1][j], d[i][j-1] + a[j]),向下遞歸併且記錄d[i][j]是否已得到即可(應該算是區間dp?)。

代碼:

#include

#include

using namespace std;

#define maxn (111)

int a[maxn], d[maxn][maxn], vis[maxn][maxn], sum;

void dp(int l, int r, int tot)

{

if(vis[l][r]) return ;

if(l == r) { d[l][r] = a[l]; vis[l][r] = 1; return; }

dp(l + 1, r, tot - a[l]); dp(l, r - 1, tot - a[r]);

d[l][r] = max(tot - d[l + 1][r], tot - d[l][r - 1]);

vis[l][r] = 1;

}

int main()

{

int N;

cin >> N;

for(int i = 1; i <= N; i++)

{

scanf("%d", &a[i]);

sum += a[i];

}

dp(1, N, sum);

cout << d[1][N] << " " << sum - d[1][N] << endl;

return 0;

}