题目:
思路:除了起点,终点都不能重复走,那么我们可以把除了这两个点走过的可到达终点的路径变成'#',这个可以用一个vector来记录和回溯即可。
#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> P;
#define fi first
#define sc second
#define mp(a,b) make_pair(a,b)
#define pb(a) push_back(a)
#define rep(i,m,n) for(int i=m;i<n;i++)
#define repn(i,m,n) for(int i=m;i<=n;i++)
const int maxn=21;
int n;
char c[maxn][maxn];
int vis[maxn][maxn];
int ans=0;
vector<int> vx;
vector<int> vy;
void dfs(int x,int y){
if(x==n&y==n){
ans++;
rep(i,0,vx.size()){
c[vx[i]][vy[i]]='#';
}
c[n][n]='.';
c[1][1]='.';
return;
}
int flag=0;
if(x+1<=n&c[x+1][y]=='.'){
vx.pb(x+1);
vy.pb(y);
flag=1;
dfs(x+1,y);
vx.pop_back();
vy.pop_back();
}
if(c[x][y]=='#') return;
if(y+1<=n&c[x][y+1]=='.'){
vx.pb(x);
vy.pb(y+1);
dfs(x,y+1);
vx.pop_back();
vy.pop_back();
}
}
int main(){
int t;
cin>>t;
while(t--){
vx.clear();
vy.clear();
cin>>n;
ans=0;
rep(i,1,n+1){
rep(j,1,n+1){
cin>>c[i][j];
}
}
if(c[1][1]=='#'||c[n][n]=='#'){
cout<<"0"<<endl;
continue;
}
dfs(1,1);
// rep(i,1,n+1){
// rep(j,1,n+1){
// cout<<c[i][j];
// }
// cout<<endl;
// }
cout<<ans<<endl;
}
}
//1
//3
//...
//#..
//...