前往:我自己搭建的博客
题目
题解
由于第一步只能向下或向右,所以不相交的路径最多只有两条。让第一步向下的路径尽量靠着左下角走(即先尝试向下走,再尝试向右走),为另一条路留出最大的空间,然后再尝试走第二条路。
代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int inf=0x7fffffff;
const int maxn=15;
int n;
char s[maxn];
bool a[maxn][maxn],vis[maxn][maxn];
bool dfs1(int y,int x)
{
if(y==n&&x==n) return 1;
if(y+1<=n&&a[y+1][x])
{
if(dfs1(y+1,x)) {vis[y][x]=1; return 1;}
}
if(x+1<=n&&a[y][x+1])
{
if(dfs1(y,x+1)) {vis[y][x]=1; return 1;}
}
return 0;
}
bool dfs2(int y,int x)
{
if(y==n&&x==n) return 1;
if(x+1<=n&&a[y][x+1]&&!vis[y][x+1])
{
if(dfs2(y,x+1)) return 1;
}
if(y+1<=n&&a[y+1][x]&&!vis[y+1][x])
{
if(dfs2(y+1,x)) return 1;
}
return 0;
}
int main()
{
int T; scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%s",s+1);
for(int j=1;j<=n;j++)
{
if(s[j]=='.') a[i][j]=1;
else a[i][j]=0;
}
}
memset(vis,0,sizeof(vis));
int ans=0;
if(!a[1][1]) {printf("0\n"); continue;}
if(dfs1(1,1))
{
ans++;
if(dfs2(1,1)) ans++;
}
printf("%d\n",ans);
}
return 0;
}