# 交大GPE程式檢定2025.10.29題目和題解
## 題目
### pA Power Crisis
Uva原題連結:
https://onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&category=0&problem=87&mosmsg=Submission+received+with+ID+30765429
#### 題意:
給定一個整數$n$,從$1$開始每次往右走$m$步(超過回到1),走過的不會重複計算到,走過的標記起來,如果想要最後才走到13,最小的$m$是多少?
#### 範圍:
$13 \leq n \leq 100$
#### 想法:
枚舉從小到大所有$m$,用bool陣列紀錄哪些走過了,用$step$紀錄本輪走過多少次沒走過的點,走了$n-1$個點後看$visited[13]$有沒有走過
#### 扣德:
```cpp=
#include<bits/stdc++.h>
using namespace std;
int n;
bool can(int m){
int cnt=1;
int idx=1;
vector<bool>visited(n+1,0);
visited[1]=true;
while(cnt<n-1){
int step=0;
while(step<m){
idx++;
idx=idx%n;
if(!visited[idx]){
step++;
}
}
//cerr<<idx<<'\n';
visited[idx]=true;
cnt++;
}
if(!visited[13])return true;
else return false;
}
int main(){
while(cin>>n&&n){
for(int m=1;m<n;m++){
if(can(m)){
cout<<m<<'\n';
break;
}
}
}
}
```
---
### pB Dungeon Master
Uva原題連結:
https://onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&category=0&problem=473&mosmsg=Submission+received+with+ID+30765465
#### 題意:
給一個立體的地圖,問能不能從起點走到終點,可以的話最快走幾步會到?
#### 範圍:
$l,r,c \leq 30$
#### 想法:
用BFS來做,如果能走到就代表有路,根據BFS的性質也可以保證步數是最少的。
(麻煩實作題)
#### 扣德:
```cpp=
#include<bits/stdc++.h>
using namespace std;
int l,r,c;
bool inrange(int x,int y,int z){
return x>=0&&x<l&&y>=0&&y<r&&z>=0&&z<c;
}
class spot{
public:
int x,y,z,cnt;
};
int main(){
while(cin>>l>>r>>c){
int sl,sr,sc,el,er,ec;
if(l==0&&r==0&&c==0)break;
char dungeon[35][35][35];
for(int i=0;i<l;i++){
for(int j=0;j<r;j++){
for(int k=0;k<c;k++){
cin>>dungeon[i][j][k];
if(dungeon[i][j][k]=='S'){
sl=i;
sr=j;
sc=k;
}else if(dungeon[i][j][k]=='E'){
el=i;
er=j;
ec=k;
}
}
}
}
//cerr<<sl<<' '<<sr<<' '<<sc<<'\n';
int dir[6][3]={{1,0,0},{-1,0,0},{0,1,0},{0,-1,0},{0,0,1},{0,0,-1}};
bool visited[35][35][35]={0};
visited[sl][sr][sc]=true;
queue<spot>q;
q.push({sl,sr,sc,0});
bool flag=false;
while(q.size()>0){
spot t=q.front();q.pop();
if(t.x==el&&t.y==er&&t.z==ec){
cout<<"Escaped in "<<t.cnt<<" minute(s).\n";
//cerr<<t.x<<' '<<t.y<<' '<<t.z<<'\n';
//cerr<<el<<' '<<er<<' '<<ec<<'\n';
flag=true;
break;
}
for(int i=0;i<6;i++){
if(inrange(t.x+dir[i][0],t.y+dir[i][1],t.z+dir[i][2])){
if(!visited[t.x+dir[i][0]][t.y+dir[i][1]][t.z+dir[i][2]]){
if(dungeon[t.x+dir[i][0]][t.y+dir[i][1]][t.z+dir[i][2]]!='#'){
q.push({t.x+dir[i][0],t.y+dir[i][1],t.z+dir[i][2],t.cnt+1});
visited[t.x+dir[i][0]][t.y+dir[i][1]][t.z+dir[i][2]]=true;
}
}
}
}
}
if(!flag)cout<<"Trapped!\n";
}
}
```
---
### pC Automated Judge Script
Uva原題連結:
https://onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&category=0&problem=1129&mosmsg=Submission+received+with+ID+30765671
#### 題意:
給正確的字串以及使用者輸出的字串,判斷是:
1. AC:完全一模一樣
2. PE:數字一模一樣,但其他地方有錯
3. WA:其他情形
#### 範圍:
$1 \leq 字串總數 \leq 99$
#### 想法:
先跑一遍看有沒有完全一樣,有地方不一樣的話就提取出純數字的字串,判斷這個字串有沒有一模一樣。
#### 扣德:
```cpp=
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
int round=1;
while(cin>>n&&n){
cin.ignore();
string s[105];
for(int i=0;i<n;i++)getline(cin,s[i]);
int m;cin>>m;
cin.ignore();
string t[105];
for(int i=0;i<m;i++)getline(cin,t[i]);
bool flag=false;
if(n!=m){
flag=true;
} else {
for(int i=0;i<n;i++){
if(s[i].size()!=t[i].size()){
flag=true;
break;
}
for(int j=0;j<s[i].size();j++){
if(s[i][j]!=t[i][j]){
flag=true;
goto here;
}
}
}
}
here:
if(!flag){
cout<<"Run #"<<round<<": Accepted\n";
round++;
continue;
}else{
bool out=false;
vector<char>new_s,new_t;
for(int i=0;i<n;i++){
for(int j=0;j<s[i].size();j++){
if('0'<=s[i][j]&&s[i][j]<='9'){
new_s.push_back(s[i][j]);
}
}
}
for(int i=0;i<m;i++){
for(int j=0;j<t[i].size();j++){
if('0'<=t[i][j]&&t[i][j]<='9'){
new_t.push_back(t[i][j]);
}
}
}
if(new_s.size()!=new_t.size()){
out=true;
}else{
for(int j=0;j<new_s.size();j++){
if(new_s[j]!=new_t[j]){
out=true;
goto he;
}
}
}
he:
if(out){
cout<<"Run #"<<round<<": Wrong Answer\n";
round++;
continue;
}else{
cout<<"Run #"<<round<<": Presentation Error\n";
round++;
continue;
}
}
}
}
```