導航:首頁 > 編程語言 > 湖南省程序設計大賽試題

湖南省程序設計大賽試題

發布時間:2023-08-09 13:00:17

1. 求程序設計大賽題目

一、行棋游戲:
這是一種只有一個棋子的游戲。棋盤被分為N行,M列的方格,某個位置被標記為終點T。在任何一個位置,棋子可以向左、右、上、下四個方向移動一格,記移動距離為1。
在棋盤上有一些特殊方格——飛行器,每個飛行器有一個飛行距離d,棋子達到後可以繼續在同方向再「飛」d格,且移動距離仍然為1。例如,如果棋子在位置(2,8),飛行器在位置(2,7),且飛行距離為5,那麼棋子向左走一格,將直接到達位置(2,2)且移動距離為1。如果飛行點落在棋盤外,則只能停在邊界上。例如,假若前個飛行器的飛行距離為10,那麼棋子的最終位置是(2,1)。
而且,如果飛行後的落點仍然是飛行器,則將連續飛行到目的地,且中間點不對當前棋子產生影響,當然也不算任何移動距離。例如,如果棋子位置在(2,8),飛行器在(2,7)、(2,5),且飛行距離都是5,此時棋子向左移動一格,則(2,5)的飛行器將不產生作用,移動距離仍然為1。
你的任務就是,編程計算出棋子達到終點的最短移動距離。
輸入:
輸入可以有多個測試用例。每個測試用例的第一行是兩個整數N、M(3<=N, M<=100),表示棋盤的行列數。隨後是一個整數K,表示飛行器的個數。接著的K行每行有3個正整數x、y、d,分別表示飛行器的位置(x,y)(2 <= x <= N-1, 2 <= y <= M-1)及飛行距離d。最後的兩行第一行是棋子的初始位置S,第二行是終點位置T。你可以假設數據總是合法的,S與T、飛行器位置互不相同。輸入0 0時表示結束
輸出:
每個測試用例輸出一行,即達到終點的最短距離。如果不能達到,則輸出「Impossible」。

二、最少錢幣數:
(這個問題的輸入我感覺特別麻煩,希望給出比較好的輸入方法)
這是一個古老而又經典的問題。用給定的幾種錢幣湊成某個錢數,一般而言有多種方式。例如:給定了6種錢幣面值為2、5、10、20、50、100,用來湊15元,可以用5個2元、1個5元,或者3個5元,或者1個5元、1個10元,等等。顯然,最少需要2個錢幣才能湊成15元。
你的任務就是,給定若干個互不相同的錢幣面值,編程計算,最少需要多少個錢幣才能湊成某個給出的錢數。
輸入:
輸入可以有多個測試用例。每個測試用例的第一行是待湊的錢數值M(1 <= M <= 2000,整數),接著的一行中,第一個整數K(1 <= K <= 10)表示幣種個數,隨後是K個互不相同的錢幣面值Ki(1 <= Ki <= 1000)。輸入M=0時結束。
輸出:
每個測試用例輸出一行,即湊成錢數值M最少需要的錢幣個數。如果湊錢失敗,輸出「Impossible」。你可以假設,每種待湊錢幣的數量是無限多的。
樣例輸入:
15
6 2 5 10 20 50 100
1
1 2
0
樣例輸出:
2
Impossible 最佳答案第一題,典型的BFS找最短路

#include <iostream>
#define MAXN 105
using namespace std;
const int dir[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
int m,n;
int map[MAXN][MAXN];
int head,tail;
int queue[MAXN*MAXN][3];
bool hash[MAXN][MAXN];
int tx,ty;

int main()
{
while (cin>>n>>m && n>0)
{
int i,j,k;
memset(map,0,sizeof(map));
cin>>k;
while (k--)
{
cin>>i>>j;
i--;
j--;
cin>>map[i][j];
}
memset(hash,true,sizeof(hash));
cin>>queue[0][0]>>queue[0][1];
queue[0][0]--;
queue[0][1]--;
queue[0][2]=0;
hash[queue[0][0]][queue[0][1]]=false;
head=0;
tail=1;
cin>>tx>>ty;
tx--;
ty--;
while (head<tail && hash[tx][ty])
{
for (k=0;k<4;k++)
{
i=queue[head][0]+dir[k][0];
j=queue[head][1]+dir[k][1];
while (i>=0 && i<n && j>=0 && j<m && map[i][j]>0)
{
i+=map[i][j]*dir[k][0];
j+=map[i][j]*dir[k][1];
if (i<0 || i>=n || j<0 || j>=m)
{
if (i<0) i=0;
if (i>=n) i=n-1;
if (j<0) j=0;
if (j>=m) j=m-1;
break;
}
}
if (i>=0 && i<n && j>=0 && j<m)
if (hash[i][j])
{
queue[tail][0]=i;
queue[tail][1]=j;
queue[tail][2]=queue[head][2]+1;
hash[i][j]=false;
if (i==tx && j==ty) cout<<queue[tail][2]<<endl;
tail++;
}
}
head++;
}
if (hash[tx][ty]) cout<<"impossible"<<endl;
}
return 0;
}

第二題是典型的DP
用f[i][j]表示用前i種幣值湊出總額為j的錢所需的最少錢幣個數
狀態轉移方程f[i][j]=min{f[i-1][j](i>0時),f[i][j-Ki]+1(j>=Ki時),無窮大};

#include <iostream>
#define MAXM 2010
#definme MAXK 15
using namespace std;
int m,k;
int K[MAXK];
int f[MAXK][MAXM];
int main()
{
while (cin>>m && m>0)
{
int i,j;
cin>>k;
for (i=1;i<=k;i++) cin>>K[i];
memset(f,-1,sizeof(f));
f[0][0]=0;
for (i=1;i<=k;i++)
for (j=0;j<=m;j++)
{
int min;
min=-1;
if (f[i-1][j]!=-1 && (min==-1 || f[i-1][j]<min)) min=f[i-1][j];
if (j>=K[i] && f[i][j-K[i]]!=-1 && (min==-1 || f[i][j-K[i]]+1<min)) min=f[i][j-K[i]]+1;
f[i][j]=min;
}
if (f[k][m]==-1) cout<<"impossible"<<endl;
else cout<<f[k][m]<<endl;
}
return 0;
}

2. <匯編語言程序設計〉半期試題請求解答

2012年〈匯編語言程序設計〉半期試題(堂下開卷)

一.名詞解釋(本大題共5小題,每小題3分,共15分)試解釋下列名詞的含義。
1. 邏輯地址:在CPU內部的存儲單元地址表示形式,分為段基值和偏移量兩個組成部分,
它們都是16位的,在指令或源程序中只能使用邏輯地址來表達存儲單元。
2. 物理地址:CPU訪問存儲單元時向地址匯流排傳送的地址表示形式,是20位的地址,由
邏輯地址中段基值乘以16再加上偏移量得到,邏輯地址到物理地址的轉換由CPU在執行訪問存儲單元的指令時自動完成。
3. 標志寄存器:在CPU中由狀態標志位與控制標志位組成的寄存器稱為標志寄存器,其
中狀態標志位用於標識運算指令執行後運算結果的特徵,控制標志位用於控制CPU的工作模式或改變CPU對某些事件的響應方式。
4. 存儲器定址方式:即獲得存儲單元地址的方式,在8086/8088CPU中包括直接定址、寄
存器間接定址、基址定址、變址定址、基址變址定址這五種定址方式。
5. 補碼:CPU內部用於表示帶符號數的一種編碼,正數的補碼為真值本身,負數的補碼為
真值變反加1的結果。
二.計算題(本大題共5小題,每小題4分,共20分)試按照各小題的要求給出計算結果。
1. 將十進制數100分別轉換為二進制、十六進制數,它們的表示形式分別為多少? 答:100的十六進製表示為64H,二進製表示為01100100B。 2. 假設(DS)=0B00H,(BX)=0210H,對於指令MOV DS:120H[BX],AL,其目的
操作數的物理地址為多少?
答:EA=(BX)+120H = 0210H+0120H = 0330H,物理地址 = (DS)*16+EA = 0B000H+0330H=0B330H。 3. 假設(BX)=0210H,(DI)=0060H,對於指令ADD DL,[BX][DI],其源操作數的偏
移量為多少?
答:源操作數EA = (BX)+(DI)= 0210H+0060H =0270H。 4. 假設當前(SP)=0060H,連續執行5條PUSH指令後,(SP)=? 答:(SP)=0060H – 5*2 = 0060H – 000AH = 0056H
5. 對於一個十進制數 – 65,其二進制補碼表示形式為多少?
答:先將數值轉換為二進製表示: - 65 = - 41H = - 01000001B ,由於是負數,變反加1得到補碼形式:10111110B +00000001B = 10111111B
三.排錯題(本大題共4小題,每小題5分,共20分)每小題列出了一條指令,判斷該指
令有無語法錯誤,如果存在語法錯誤,請指出具體的錯誤原因,判斷正確給2分,分析正確給3分,判斷錯誤不給分。
1. PUSH 5588H
答:錯誤,單操作數指令不能使用立即數定址方式。 2. MOV DS, 1720H

答:錯誤,MOV指令不能將立即數直接傳送至段寄存器,需要通用寄存器作為中轉。 3. ADD AX, CL
答:錯誤,兩個操作數的類型不匹配,AX為16位,CL為8位。 4. AND AX,[DX]
答:錯誤,DX寄存器不能用作存儲器定址方式中的基址或變址分量。
四.程序分析題(本大題共6小題,每小題5分,共30分)每小題列出了一段小的程序片
段和相關存儲單元的初始值,請按題目的要求分析各程序片段的運行結果。(寄存器中的內容請使用十六進制形式給出)
1. 閱讀如下程序片段
MOV AL,4CH MOV BL,0B5H ADD AL,BL
執行上述程序片段後,(AL)= 01H (1分),(BL)= 0B5H (1分), CF= 1 (1分),OF= 0 (1分),PF= 0 (1分)
2. 閱讀如下程序片段
MOV AL,0F3H MOV DL,0C4H ADD AL,DL AND AL,0FH
執行上述程序片段後,(AL)= 07H (1分),(AF)= 不確定 (1分), CF= 0 (1分),OF= 0 (1分),PF= 0 (1分)
3. 閱讀如下程序片段
MOV AL,7EH MOV CL,04H ROL AL,CL
執行上述程序片段後,(AL)= 0E7H (2分),(CL)= 04H (1分), CF= 1 (1分),OF= 不確定 (1分)
4. 閱讀如下程序片段
MOV AX,0632H MOV BX,0C202H SUB AX,BX INC AX

執行上述程序片段後,(AX)= 4431H (2分),(CF)= 1 (2分), OF= 0 (1分)
5. 閱讀如下程序片段,假設(DS)=0100H,位元組單元(01024H)=56H,位元組單元(01025H)
=28H
MOV BX,0024H LEA BX,[BX] OR BX,0 ADC BX,[BX]
執行上述程序片段後,(BX)= 287AH (3分),(CF)= 0 (2分), OF= 0 (1分)
6. 閱讀如下程序片段,假設(SP)=0064H
MOV AX,0001H MOV BX,0002H PUSH AX PUSH BX POP CX POP BX
執行上述程序片段後,(AX)= 0001H (2分),(BX)= 0001H (2分), (SP)= 0064H (1分)
五.程序設計題(本大題共2小題,第一小題7分,第二小題8分,共15分)
1. 試編寫一程序片段,實現BL高4位與低4位相互交換(7分) 答:
mov cl, 4 rol bl, cl
2. 試編寫一程序片段,不使用乘除法指令,實現((AX)*5+14)/ 2的功能(AX中的數
據理解為補碼)(8分) 答:
mov bx, ax mov cl, 2 sal ax, cl add ax, bx add ax, 14 sar ax, 1

3. C語言程序設計試題

1. 一條簡單語句是以_____;___字元作為結束符的,一條復合語句是分別以___{_____字元和_____}___字元作為開始符和結束符的。
2. 任何一個C++程序至少且只能包含一個_____主___函數,且程序總是從這個函數開始執行,不論這個函數的位置如何。一個函數定義由 函數頭 和 函數體 兩部分組成。
3. C++頭文件和源程序文件的擴展名分別為 .h 和 .cpp。
4. cout與操作符__<<_配合使用才能顯示輸出,cin與操作符_>>_配合使用才能實現輸入。
5. 數據類型int,char,bool,float,double, int * 等的類型長度分別為___4_、1_、_1_、_4、_8___和_____4___。
6. 數值常量46、0173和0x62對應的十進制值分別為_____46___、____123____和______98__。
7. 字元串」It\』s\40a\40C++programe!」中包含有______19____個字元。
8. 若x=5,y=10,則計算y*=++x表達式後,x和y的值分別為____6____和____60____。
9. 若x=25,則計算y=x--表達式後,x和y的值分別為____24____和__25______。
10. 假定x和ch分別為int型和char型,則sizeof(x)和sizeof(ch)的值分別為___4_____和_____1___。
11. 假定x=64,y=88,則x<<2和y>>2的值分別為____128____和___44_____。
12. 假定x是一個邏輯量,則x&&true的值與_____x___的值相同,x||false的值也與_____x___的值相同。
13. 假定x是一個邏輯量,則x&&!x和x||!x的值分別為____0____和____1____。
14. 假定x=10,則表達式x<=10?20:30的值為____20____。
15. 表達式sqrt(81)和pow(6,3)的值分別為________9______和_________216_____。
16. 數學算式(1+x)sin48°和axbex+1對應的算術表達式分別為___(1+x)*sin(48*3.14159/180)_____和_____a*pow(x,b)*exp(x+1)___。
17. 邏輯表達式:a>=x||b>2*y+10的相反式為:___~(a<=x&&2*y+10)_____。
18. 在嵌套的if語句中,每個else關鍵字與它前面最接近的____if____關鍵字相配套。
19. 在for語句中,假定循環體被執行次數為n,則<表達式1>共被計算____n___次,<表達式2>共被計算____n____次,<表達式3>共被計算____n____次。
20. 執行for和while循環時,每次是先進行____條件____的判斷,然後再執行____循環___,執行do循環時則相反。
另外,站長團上有產品團購,便宜有保證

閱讀全文

與湖南省程序設計大賽試題相關的資料

熱點內容
蘭博玩游戲路徑怎麼選擇正確文件 瀏覽:972
淘寶直通車恢復老版本 瀏覽:510
播放草莓的圖片我都文件 瀏覽:55
微信大文件打不開 瀏覽:767
家裝合同准備哪些文件 瀏覽:296
應用bat合並excel文件 瀏覽:984
迅雷影音文件夾 瀏覽:109
makefile的文件路徑 瀏覽:392
計算機程序文件名擴展名為 瀏覽:982
網路游戲推廣策劃案 瀏覽:609
替換所有文件內容的代碼 瀏覽:960
不是常用數據模型有哪些 瀏覽:426
aspcms版本號 瀏覽:835
安卓怎麼用數據流量下載軟體 瀏覽:553
大眾手動空調數據流通道號是多少 瀏覽:303
手機qq令牌 瀏覽:737
cg原畫上色教程 瀏覽:993
婚介服務中心app怎麼做 瀏覽:43
日本蘋果66g多少錢 瀏覽:93
個性的文件夾名稱 瀏覽:697

友情鏈接