日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

对称迷宫

發布時間:2023/12/4 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 对称迷宫 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

描述

wlxsq有一個N*NN?N的網格迷宮,每一個網格都有一個字母編號。

他要從左上角(1,1)(1,1)出發,走到右下角(n,n)(n,n),由于wlxsq很懶,所以他每次只會往右或者往下走一格。
由于最后到終點的路徑方案太多太多了,所以wlxsq想讓你計算出所有不同的對稱的路徑個數。
例如:N = 3N=3
ABA
BBB
ABA
對稱路徑6條:有ABABA(2條)、ABBBA(4條)
不同的對稱路徑有: 有ABABA、ABBBA

輸入
第一行輸入一個數NN,表示迷宮的大小。
接下來輸入N*NN?N的字母迷宮

輸出
輸出對稱路徑的數量

樣例
3
ABA
BBB
ABA

輸出
2

提示
【評測用例規模與約定】
對于40%40%的數據,2<=N<=112<=N<=11

對于100%100%的數據,2<=N<=182<=N<=18



在這一題種我們一般會想到先整體深搜一便保存所有路徑,然后再判斷是不是對稱路徑,然后再進行判重,但是這是一種完全暴力的方法,雖然一開始我也是這樣做的O(∩_∩)O,這樣不僅會超時,還會爆內存,逼近最大的圖是18路勁大概有2^18次方條。
我們搞算法的就要盡可能的優化它,于是有了第二種思路
搜索兩遍,第一遍從1,1位置搜索,第二遍從n,n位置搜索,分別保存路徑和末尾點,然后再比對末尾點是否相同,路徑是否相同,這里的路勁也是一個非常龐大的數據,而且加上判重,優化不好也會超時。
我們想判重能用什么方法,對于數字的判重我們可以用一個visit數組判斷,對于路勁呢,沒錯我們能用map來判斷,下面就是最后AC題的代碼。

#include<iostream> #include<cstring> #include<queue> #include<vector> #include<map> using namespace std; const int maxn=30; const int ax[4]={1,0,0,-1}; const int ay[4]={0,1,-1,0}; int n,ans; char maze[maxn][maxn]; map<string,int>t; map<string,int>T[maxn]; void dfs1(int x,int y,string a) {//第一遍搜索if(x+y==n+1) {T[x][a]=1;return ;}for(int i=0;i<2;i++)dfs1(x+ax[i],y+ay[i],a+maze[x+ax[i]][y+ay[i]]); } void dfs2(int x,int y,string b) {//第二遍搜索加判重。if(x+y==n+1) {if(T[x][b]==1&&!t[b]) {如果t[b]不為零則代表之前有路徑是b的但是通過的是不同的點,T[x][b]來判斷在x位置的點是否是路徑上半與現在搜索的一樣。ans++;t[b]=1;//標記上已近存在答案,判重,}return ;}for(int i=2;i<4;i++)dfs2(x+ax[i],y+ay[i],b+maze[x+ax[i]][y+ay[i]]); } int main() {cin>>n;ans=0;for(int i=1;i<=n;i++) for(int j=1;j<=n;j++)cin>>maze[i][j];string a;a+=maze[1][1];dfs1(1,1,a);string b;b+=maze[n][n];dfs2(n,n,b);cout<<ans<<endl;return 0; }

或許有人會問為什么T數組只有一維,為什么只要判斷x不用判斷y,應為這里x+y==n+1,所有的點都落在的對角線上。

總結

以上是生活随笔為你收集整理的对称迷宫的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。