2020年第十一屆藍橋杯大賽軟體類決賽(國賽) C/C++ 大學A組 E題玩具蛇
阿新 • • 發佈:2020-11-20
試題 E: 玩具蛇(15 分)
【問題描述】
小藍有一條玩具蛇,一共有 16 節,上面標著數字 1 至 16。每一節都是一個正方形的形狀。相鄰的兩節可以成直線或者成 90 度角。
小藍還有一個 4 × 4 的方格盒子,用於存放玩具蛇,盒子的方格上依次標著字母 A 到 P 共 16 個字母。
小藍可以摺疊自己的玩具蛇放到盒子裡面。他發現,有很多種方案可以將玩具蛇放進去。
下圖給出了兩種方案:
請幫小藍計算一下,總共有多少種不同的方案。如果兩個方案中,存在玩具蛇的某一節放在了盒子的不同格子裡,則認為是不同的方案。
【答案提交】
這是一道結果填空的題,你只需要算出結果後提交即可。本題的結果為一個整數,在提交答案時只填寫這個整數,填寫多餘的內容將無法得分。
終於想起來要補這道題了(T_T)
當時只寫了兩道填空和一道程式設計吧,那道程式設計也是湊測試資料範圍沒有全部得分,然後就沒什麼時間去其他題騙騙分了,都空著交上去,現在當事人就是十分後悔,差七名國三(雖然還是很菜,但是我要這優秀獎有何用┭┮﹏┭┮),由於對dfs不是很熟,導致都沒想到這題要dfs,下次參賽前一定要熟練掌握dfs和bfs!!!
大概就是從蛇頭開始,1的位置能放16個,然後依次dfs就好
//552 #include<bits/stdc++.h> using namespace std; typedef long long ll; int mp[10][10]; int ans; int n=4; int dx[]={1,0,-1,0}; int dy[]={0,1,0,-1}; void dfs(int x,int y,int now){ if(now==n*n){ ++ans; // for(int i=1;i<=n;i++){ // for(int j=1;j<=n;j++){ // cout<<mp[i][j]<<" "; // } // cout<<endl; // } // cout<<endl; return ; } for(int i=0;i<4;i++){ int fx=x+dx[i]; int fy=y+dy[i]; if(fx>=1 && fy>=1 && fx<=n && fy<=n && !mp[fx][fy]){ mp[fx][fy]=now+1; dfs(fx,fy,now+1); mp[fx][fy]=0; } } } int main(){ for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ memset(mp,0,sizeof mp);//sizeof返回記憶體位元組數 mp[i][j]=1; dfs(i,j,1); } } cout<<ans<<endl; return 0; }