迷宫
洛谷题目链接:迷宫
#include<bits/stdc++.h>
using namespace std;
int n,m,t,sx,sy,fx,fy,ans;
bool vis[10][10];//表示走过的路径
bool mp[10][10]; //表示有路障
int xx[] = {1,0,-1,0};
int yy[] = {0,-1,0,1};
void dfs(int x,int y)
{
if(x == fx&& y ==fy)
{
ans++;
return;
}
for(int i = 0;i<4;i++)//枚举四个方向
{
int dx = xx[i]+x;
int dy = yy[i]+y;
if(dx>=1&&dx<=n&&dy>=1&&dy<=m&& !mp[dx][dy] && !vis[dx][dy])
{
vis[dx][dy]=1;//标记当前路径走过
dfs(dx,dy);
vis[dx][dy]=0;//回溯
}
}
}
int main()
{
cin>>n>>m>>t>>sx>>sy>>fx>>fy;
while(t--)
{
int x,y;
cin>>x>>y;
mp[x][y]=1;
}
vis[sx][sy] = 1;//标记传入的初始位置已经走过
dfs(sx,sy);
cout<<ans;
return 0;
}
单词接龙
洛谷题目链接:单词接龙
#include<bits/stdc++.h>
using namespace std;
string a[22];
int n,ans;
int counts[22];//使用次数
void dfs(string x,int s)
{
ans = max(ans,s);//更新最终结果
for(int i = 1;i<=n;i++)
{
int p = 1;//记录重合的字符个数
int la = x.length(),lb = a[i].length();
while(p<min(la,lb))//当重复字符个数小于最小字符串长度时
{
if(x.substr(la-p) == a[i].substr(0,p) && counts[i]<2)//x字符串的后序 == a[i]的前序
{
counts[i]++;
dfs(a[i],s+lb-p);//减去重合字符长度p
counts[i]--;//回溯
break;
}
p++;
}
}
}
int main()
{
cin>>n;
for(int i =1;i<=n;i++)
{
cin>>a[i];
}
char t;
cin>>t;
for(int i =1;i<=n;i++)
{
if(a[i][0] == t) //如果当前字符串的首字符==t,开始搜索
{
counts[i]++;
dfs(a[i],a[i].length());
counts[i]--;
}
}
cout<<ans;
}