編程競賽題
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. 試題題目(編程要求): c語言題
第五屆全國ITAT教育工程就業技能大賽復賽試題 C語言程序設計B卷
請考生仔細閱讀並嚴格遵守題目中關於文件保存和命名的要求。
請務必按照試卷要求為文件命名。
考生答題完畢後,首先創建以「准考證號」命名的文件夾(形式如:433034683),並將考試結果嚴格按題目上的命名要求進行命名並直接保存在該文件夾下。
注意:考生不得在該文件夾下創建任何子文件夾,所有考試結果均直接保存在該文件夾根目錄下。
然後選中整個文件夾,用Winrar壓縮工具打包後存放在本考場指定的考試結果存放地址,經監考老師確認上傳無誤後方可離開考場。
注意:在提交答案時,請務必選中上述存放作品的文件夾(如前面創建的433034683文件夾,而不是文件夾下的全部文件)進行壓縮,在完成答案提交後,請確保上述壓縮包仍保存在本地計算機中。
請務必按照試卷要求提交指定的文件,不得包含非題目要求的過程文件和臨時文件,不得包含本試題文件和試題素材。
注意:凡違反上述規定的考生,其成績一律按零分處理。
題目命名要求:請將編寫好的源程序以題號命名,例如第1題的源程序保存為「1.C」 )。
重要提示:由於時間有限,請考生首先保證編寫的程序在Wintc環境下可以編譯通過並執行,並在此基礎上保證完成考題要求的全部功能,以免因編譯不通過影響考生的考試成績。
1、 編程解決如下問題:雞翁一,值錢五;雞母一,值錢三;雞雛三,值錢一。百錢買百雞, 問雞翁,雞母,雞雛各幾何?(20分)
2、 編程實現:有二維數組a[3][3]=,,},將數組a的每一行元素均除以該行上絕對值最大的元素,按行輸出新數組。(20分)
3、 編程:設x、y取值為區間[1,10]的整數, f(x,y)=(3x-2y)/(x+y),求使f(x,y)取最小值的x1、y1,要求使用自定義函數實現f(x,y)功能。(20分)
4、 編寫函數fun,其功能是:在字元串中所有數字字元前加一個「*」字元,要求通過指針實現。(20分)
5、 編程:已知學生記錄由學號和學習成績構成,N名學生的記錄已存入結構體數組中,找出成績最低的學生,並輸出這個學生的信息,已知學生信息如下。(20分)
A01,81;A02,89;A03,66;A04,87;A05,77
A06,90;A07,79;A08,61;A09,80;A10,71
6、 附加題:編寫一個函數InverseByWord(char *sentence),實現一個英文句子按單詞逆序存放的功能,並給出測試程序。(50分)
如:This is an interesting programme.
逆序後變為:.programme interesting an is This
第五屆全國ITAT教育工程就業技能大賽復賽試題
C語言程序設計(A卷)
請考生仔細閱讀並嚴格遵守題目中關於文件保存和命名的要求。請務必按照試卷要求為文件命名。 考生答題完畢後,首先創建以「准考證號」命名的文件夾(形式如:433034683),並將考試結果嚴格按題目上的命名要求進行命名並直接保存在該文件夾下。
注意:考生不得在該文件夾下創建任何子文件夾,所有考試結果均直接保存在該文件夾根目錄下。
然後選中整個文件夾,用Winrar壓縮工具打包後存放在本考場指定的考試結果存放地址,經監考老師確認上傳無誤後方可離開考場。
注意:在提交答案簡世時,請務必選中上述存放作品的文件夾(如前面創建的433034683文件夾,而不是文件夾下的全部文件)進行壓縮,在完成答案提交後,請確保上述壓縮包仍保存在本地計算機中。
請務必按照試卷要求提交指定的文件,不得包含非題目要彎橘求的過程文件和臨時文件,不得包含本試題文件和試題素材。
注意:凡違反上述規定的考生,其成績一律按零分處理。
題目命名要求:請將編寫好的源程序以題號命名,例如第1題的源程序保存為「1.C」 。
重要提示:由於時間有限,請考生首先保證編寫的程序在Wintc環境下可以編譯通過並執行,並在此基礎上完成考題要求的全部功能,以免因編譯不通過影響考生的考試成績。
1、編程解決如下數學問題:有12升水,怎樣利用一個8升和一個5升的容器將水分為兩個6升?要求以如下格式列印出分水步驟。(20分埋咐團)
a12 b8 c5
12 0 0
* * * ( 「*」表示當前狀態下每個容器的盛水量)
......
0 6 6
2、編程實現:有二維數組a[3][3]=,,},將數組a的每一行元素均除以該行上的主對角元素(第1行同除以a[0][0],第2行同除以a[1][1],...),按行輸出新數組。(20分)
3、編程:設x取值為區間[1,20]的整數,求函數f(x)=x-sin(x)- cos(x)的最大值,要求使用自定義函數實現f(x)功能。(20分)
4、編寫函數fun,通過指針實現將一個字元串反向。要求主函數輸入字元串,通過調用函數fun實現輸入字元串反向。(20分)
5、已知學生三門課程基本信息如下。請使用結構體編程,計算學生三門課程平均成績後,列表輸出學生的姓名、數學、英語、計算機、平均分信息,並按平均分排序。(20分)
姓名 數學 英語 計算機
Mary 93 100 88
Jone 82 90 90
Peter 91 76 71
Rose 100 80 92
6、附加題:編程實現輸入一串英文,統計其中各單詞出現的個數(不區分大小寫字母),以「000」作為字元串輸入結束標志,例如:
Twinkle twinkle little star 000(回車)
twinkle little star
2 1 1 (50分)
3. 大一,差不多學完c語言了,網上哪裡有c語言的編程題目我就是想多做做題,提高能力,謝謝大家了
就那點c語言的基礎,最多也就是在scanf,printf
如果想真正學學編程
你應該想想,為什麼c語言編程是黑色的框框, 比如像qq之類的是怎麼編寫的,,然後再去寫寫游戲,到後面寫點簡單的軟體
如果一味的光練習那種東西,也沒多大用
4. 編程題:某同學有三名同學參加數學競賽,共10道題,答對一道得10分,答錯一道
解:
小明:設小明答對了x道題,則答錯了(10-x)道題
10x-3(10-x)=87
10x-(30-3x)=87
10x-30+3x=87
10x+3x=87+30
13x=117
x=9
王紅:設王紅答對y道題,則答錯(10-y)道題
10y-3(10-y)=74
10y-(30-3y)=74
10y-30+3y=74
10y+3y=74+30
13y=104
y=8
張凱:設張凱答對a道題,則打錯了(10-a)道題
10a-3(10-a)=48
10a-(30-3a)=48
10a-30+3a=48
10a+3a=48+30
13a=78
a=6 答:小明答對了9道,王紅答對了8道,張凱答對了6道。
5. C語言 編程題目 程序設計題目 高中信息科技競賽編程題目 【100分】
【第一道】
#include <iostream>
using namespace std;
#define pi 3.14159265
double maxvolume(double a,double b)
{
double v1,v2,r;
r=b/(2*pi+2);
v1=pi*r*r*a;
r=a/(2*pi+2);
v2=pi*r*r*b;
if(v1>v2)
return v1;
else
return v2;
}
int main()
{
double a,b;
cout<<"請輸入矩形的長寬:";
cin>>a;
cin>>b;
cout<<"最大圓柱體積:"<<maxvolume(a,b)<<endl;
return 0;
}
【第二道】
//事實上,塗色方案不止樣例上的一種,我把所有的可行方案都輸出了一下
#include <iostream>
using namespace std;
int data[][8]={ {0},
{0,0,1,0,0,0,1,1},
{0,1,0,1,1,1,1,0},
{0,0,1,0,1,0,0,0},
{0,0,1,1,0,1,0,0},
{0,0,1,0,1,0,1,0},
{0,1,1,0,0,1,0,1},
{0,1,0,0,0,0,1,0}
};
int total;
int color[8];
char COLOR[5]={' ','R','Y','B','W'};
void output()
{
total++;
cout<<"["<<total<<"]\t";
for(int i=1;i<=7;i++)
{
cout.width(2);
cout<<COLOR[color[i]];
}
cout<<endl;
}
bool checkcolor(int s)
{
for(int i=1;i<=7;i++)
{
if(data[i][s]==1&&color[i]==color[s])
return false;
}
return true;
}
void drawcolor(int s)
{
if(s>7)
output();
else
for(int i=1;i<=4;i++)
{
color[s]=i;
if(checkcolor(s))
drawcolor(s+1);
}
}
int main()
{
cout<<" \t";
for(int i=1;i<=7;i++)
{
cout.width(2);
cout<<i;
}
cout<<endl;
drawcolor(1);
cout<<endl<<" \t塗色方案總數:"<<total<<endl<<endl;
return 0;
}
6. 編號為1到100的100盞燈
這是一個經典的智力題,常常出現在編程競賽或數學競賽中。
問題描述:有100盞燈,編號為1到100。有100位選手進入了房間,每位選手都從1開始依次進行編號。然後,按順序每10位選手同時關掉所有編號是質數的燈。
問題:最後哪些燈會亮著?
答案解析:選手編號為i,則i的質數因子個數為k,那麼i+k就是i的唯一質數因子。如果i+k≤10,那麼第i+k號燈將被關掉;否則第i+k號燈將會被留下。
2、要善於尋找和運用規律
智力題中常常涉及到各種規律和邏輯關系,我們需要通過仔細的觀察和分析,找到這些規律和邏輯關系。有時候這些規律和邏輯關系並不明顯,需要我們深入思考和推理。一旦找到這些規律和邏輯關系,我們就可以運用它們來解決問題。
3、要注意細節和特殊情況
在解答智力題時,細節往往是非常關鍵的。有時候一個細節的忽略會導致整個問題的解答失敗。因此,我們要特別注意題目中的細節,例如一些限制條件、特殊情況等等。此外,我們還需要考慮一些邊界情況和異常情況,確保我們的解答是完整和正確的。