程式設計大賽試題及答案

2021-04-24 06:16:16 字數 2574 閱讀 3078

一、行棋遊戲

: 這是一種只有乙個棋子的遊戲。棋盤被分為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

#define maxn 105

using namespace std;

const int dir[4][2]=,,,};

int m,n;

int map[maxn][maxn];

int head,tail;

int queue[maxn*maxn][3];

bool hash[maxn][maxn];

int tx,ty;

int main()

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=0 && i=0 && j0) }

if (i>=0 && i=0 && j第二題是典型的

dp 用f[i][j]表示用前i種幣值湊出總額為j的錢所需的最少錢幣個數

狀態轉移方程f[i][j]=min;

#include

#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]=k[i] && f[i][j-k[i]]!=-1 && (min==-1 || f[i][j-k[i]]+1注:題目不難,資料條件也比較松,所以沒做什麼優化

騰訊筆試題及答案

1.請定義乙個巨集,比較兩個數a b的大小,不能使用大於 小於 if語句 這樣轉向定義應該不算違規吧!include stdafx.h include include using namespace std define cmp x,y compare x,y intcompare inta,int...

騰訊筆試題及答案

1.請定義乙個巨集,比較兩個數a b的大小,不能使用大於 小於 if語句 這樣轉向定義應該不算違規吧!include stdafx.h include include using namespace std define cmp x,y compare x,y intcompare inta,int...

硬體筆試題及答案

引用 sandy 20008 的 硬體筆試題及答案 1 同步電路和非同步電路的區別是什麼?仕蘭微電子 非同步電路主要是組合邏輯電路,用於產生位址解碼器 或 的讀寫控制訊號脈衝,但它同時也用在時序電路中,此時它沒有統一的時鐘,狀態變化的時刻是不穩定的,通常輸入訊號只在電路處於穩定狀態時才發生變化。也就...