https://acm.sdut.edu.cn/onlinejudge3/problems/2107
dfs 就是顺着一个最初的结点开始,把与它相邻的结点都找到,也就是一直往下搜索直到尽头,然后在顺次找其他的结点。
#include
#include
#include
int a[110][110],vis[110];
int m,k;
void dfs(int x)
{
int i;
vis[x]=1;
for(i=0;i<k;i++)
{
if(vis[i]==0&&a[x][i]==1)
{
printf(" %d",i);
dfs(i);
}
}
}
int main()
{
int n,i,u,v;
scanf("%d",&n);
while(n--)
{
memset(vis,0,sizeof(vis));
memset(a,0,sizeof(a));
scanf("%d%d",&k,&m);
for(i=0;i<m;i++)
{
scanf("%d%d",&u,&v);
a[u][v]=a[v][u]=1; //无向图
}
printf("0");
dfs(0);
printf("\n");
}
return 0;
}
https://acm.sdut.edu.cn/onlinejudge3/problems/3361
优质博客:详细解释
#include
#include
#include
int a[1005][1005];
int b[1005];//存结点轨迹
int f[1005];//记录结点状态
int t,n,m,s;
int k;
void dfs(int x)
{
int i;
f[x]=1;
b[k++]=x; // 存‘去’的时候的结点
for(i=1;i<=n;i++)
{
if(f[i]==0&&a[x][i]==1)
{
f[i]=1;
dfs(i);
b[k++]=x; // 存‘回’的时候的结点
}
}
}
int main()
{
int i,u,v;
while(~scanf("%d",&t))
{
while(t--)
{
memset(a,0,sizeof(a));
memset(f,0,sizeof(f));
scanf("%d%d%d",&n,&m,&s);
for(i=0;i<m;i++)
{
scanf("%d%d",&u,&v);
a[u][v]=a[v][u]=1;
}
k=1;
dfs(s);
for(i=1;i<k;i++)
{
if(i==k-1) printf("%d",b[i]);
else printf("%d ",b[i]);
}
if(k==2*n) printf("\n"); // k-1==2*n-1
else printf(" 0\n");
}
}
return 0;
}
https://acm.sdut.edu.cn/onlinejudge3/problems/2449
详细代码解释-转
#include
#include
#include
int map[10][10];
int flag[10][10];//标记是否走过
int n,m,cnt;
void dfs(int x,int y)
{
int f[4][2]={
{
0,-1},{
-1,0},{
1,0},{
0,1}};
if(x==n&&y==m)
{
cnt++;
}
else
{
int i,tx,ty;
for(i=0;i<4;i++)
{
tx=x+f[i][0];
ty=y+f[i][1];
if(tx>=1&&tx<=n&&ty>=1&&ty<=m)
{
if(map[tx][ty]==0&&flag[tx][ty]==0)
{
flag[tx][ty]=1;
dfs(tx,ty);
flag[tx][ty]=0;
}
}
}
}
return ;
}
int main()
{
int t,i,j;
scanf("%d",&t);
while(t--)
{
memset(flag,0,sizeof(flag));
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
scanf("%d",&map[i][j]);
}
}
cnt=0;
flag[1][1]=1;
dfs(1,1);
printf("%d\n",cnt);
}
return 0;
}