1. 程式人生 > 實用技巧 >2020年第十一屆藍橋杯大賽軟體類決賽(國賽) C/C++ 大學A組 E題玩具蛇

2020年第十一屆藍橋杯大賽軟體類決賽(國賽) C/C++ 大學A組 E題玩具蛇

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