試題 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;
}