時間限制: 1000 ms 內存限制: 65536 KB

提交數: 31679 通過數: 14329
【題目描述】給出一個roe×col的大寫字母矩陣,一開始的位置為左上角,你可以向上下左右四個方向移動,并且不能移向曾經經過的字母。問最多可以經過幾個字母。
【輸入】第一行,輸入字母矩陣行數R和列數S,1≤R,S≤20。
接著輸出R行S列字母矩陣。
【輸出】最多能走過的不同字母的個數。
【輸入樣例】3 6
HFDFFB
AJHGDH
DGAGEH
【輸出樣例】6
題解較為棘手的深搜題,坑很多,麻煩也很多。
第一個麻煩,輸入是字符,中間轉換成數字時不要弄錯。
第二個麻煩,很難找到什么時候統計新增加的訪問個數好,后來那我們索性就麻煩一點,把它寫入形參,每次運行時與全局變量比較。注意,這樣寫是沒有問題的,因為在最后一次執行時不會繼續搜索,故該答案就是正確的答案。
同時也需要注意一個問題,出發前需要把起點先標記掉,不然就容易出錯。
除此之外,就很簡單啦,上代碼!
#includeusing namespace std;
const int M=25;
char e[M][M];
int ans;
int r,s;
int vis[30],dx[]={1,-1,0,0},dy[]={0,0,1,-1};
void dfs(int x,int y,int ans1){
ans=max(ans,ans1);
int d=0;
for(int i=0; i<4; i++){
int tx=x+dx[i],ty=y+dy[i];
if(tx>=1 && tx<=r && ty>=1 && ty<=s && !vis[e[tx][ty]-'A'+1]){
vis[e[tx][ty]-'A'+1]=1;
dfs(tx,ty,ans1+1);
vis[e[tx][ty]-'A'+1]=0;
}
}
}
int main(){
scanf("%d%d",&r,&s);
for(int i=1; i<=r; i++)
scanf("%s",e[i]+1);
vis[e[1][1]-'A'+1]=1;
dfs(1,1,1);
printf("%d",ans);
return 0;
} 碼字不易,關注點贊收藏支持一下吧!
你是否還在尋找穩定的海外服務器提供商?創新互聯www.cdcxhl.cn海外機房具備T級流量清洗系統配攻擊溯源,準確流量調度確保服務器高可用性,企業級服務器適合批量采購,新人活動首月15元起,快前往官網查看詳情吧
新聞名稱:c++信息學奧賽一本通1212題解-創新互聯
本文網址:http://www.yijiale78.com/article44/docdee.html
成都網站建設公司_創新互聯,為您提供域名注冊、面包屑導航、企業建站、搜索引擎優化、Google、自適應網站
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯