题目链接:http://oj.hzjingma.com/p/7808?view=classic
题目来源:竞码编程
题目描述
用EXCEL求解迷宫真香~
wlxsq有一个 N ∗ N N∗N N∗N 的网格迷宫,每一个网格都有一个字母编号。
他要从左上角 ( 1 , 1 ) (1,1) (1,1) 出发,走到右下角 ( n , n ) (n,n) (n,n) ,由于wlxsq很懒,所以他每次只会往右或者往下走一格。
由于最后到终点的路径方案太多太多了,所以wlxsq想让你计算出所有不同的对称的路径个数。
例如: N = 3 N=3 N=3
A B A ABA ABA
B B B BBB BBB
A B A ABA ABA
对称路径6条:有 A B A B A ABABA ABABA(2条)、 A B B B A ABBBA ABBBA(4条)
不同的对称路径有: 有 A B A B A ABABA ABABA、 A B B B A ABBBA ABBBA
输入描述
第一行输入一个数 N N N,表示迷宫的大小。
接下来输入 N ∗ N N∗N N∗N 的字母迷宫
输出描述
输出对称路径的数量
输入
3 3 3
A B A ABA ABA
B B B BBB BBB
A B A ABA ABA
输出
2 2 2
提示
【评测用例规模与约定】
对于 40 % 40\% 40% 的数据, 2 < = N < = 11 2<=N<=11 2<=N<=11
对于 100 % 100\% 100% 的数据, 2 < = N < = 18 2<=N<=18 2<=N<=18
思路:我们搜索一半长度的字符串,并且使用 m a p map map 来表示这个字符串存在,至于位置我们可以使用 s e t set set 或者 m a p map map 来存这个字符串所对应的位置。然后我们从 ( n , n ) (n,n) (n,n)开始搜索在得到一半长度的字符串,每查找到一个我们就检查该字符串是否存在,然后判断其位置是否对应。
//set+map
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=50;
char a[maxn][maxn];
int n;
int ans=0;
map<string,int>m;
set<string>s[maxn];
void dfs2(int x,int y,string str){
if(x<0||y<0) return ;
str+=a[x][y];
if(x+y==n-1){
if(s[x].find(str)!=s[x].end()&&m[str]){
m[str]=0;
s[x].erase(str);
ans++;
}
return ;
}
dfs2(x,y-1,str);
dfs2(x-1,y,str);
}
void dfs1(int x,int y,string str){
if(x>=n||y>=n) return ;
str+=a[x][y];
if(x+y==n-1){
m[str]=1;
s[x].insert(str);
return ;
}
dfs1(x+1,y,str);
dfs1(x,y+1,str);
}
int main(){
scanf("%d",&n);
for(int i=0;i<n;i++) scanf("%s",a[i]);
dfs1(0,0,"");
dfs2(n-1,n-1,"");
printf("%d\n",ans);
return 0;
}
//map+map
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=20;
char a[maxn][maxn];
int net[2][2]={{0,1},{1,0}};
int n,ans=0;
map<string,int>m;
map<string,int>m1[maxn];
bool check(int x,int y){
if(x<0||x>=n||y<0||y>=n)
return false;
return true;
}
void dfs2(int x,int y,string str){
if(x+y==n-1){
if(m[str]&&m1[x][str]){
m[str]=0;
ans++;
}
return ;
}
for(int i=0;i<2;i++){
int netx=x-net[i][0];
int nety=y-net[i][1];
if(check(netx,nety)) dfs2(netx,nety,str+a[netx][nety]);
}
}
void dfs1(int x,int y,string str){
if(x+y==n-1){
m[str]++;
m1[x][str]++;
return ;
}
for(int i=0;i<2;i++){
int netx=x+net[i][0];
int nety=y+net[i][1];
if(check(netx,nety)) dfs1(netx,nety,str+a[netx][nety]);
}
}
int main(){
cin>>n;
for(int i=0;i<n;i++) cin>>a[i];
dfs1(0,0,""+a[0][0]);
dfs2(n-1,n-1,""+a[n-1][n-1]);
cout<<ans<<endl;
return 0;
}