深度优先搜索(DFS):
思想:
首先以一个未被访问过的顶点作为开始顶点,沿当前顶点的边走到未访问过的顶点;当没有未访问过的顶点时,则回溯到上一个顶点,继续试探访问别的顶点,直到所有的顶点都被访问过。
完整代码:
#include<stdio.h>
int a[10],book[10],n;
void dfs(int step)
{
int i;
if(step == n+1)
{
for(i = 1;i <= n;i ++)
printf("%d",a[i]);
printf("\n");
return;
}
for(i = 1;i <= n;i ++)
{
if(book[i] == 0)
{
a[step] = i;
book[i] = 1;
dfs(step+1);
book[i] = 0;
}
}
return;
}
int main()
{
scanf("%d",&n);
dfs(1);
return 0;
}
广度优先搜索(BFS):
思想:
首先以一个未被访问过的顶点作为起始顶点,访问其所有相邻的顶点,然后对每个相邻的顶点,再访问它们相邻的未被访问过的顶点,直到所有顶点都被访问过。
完整代码:
#include<stdio.h>
struct note
{
int x;
int y;
int s;//步数
};
int main()
{
struct note que[2501];
int a[51][51]={0},book[51][51]={0};
int next[4][2]={0,1, 1,0, 0,-1, -1,0};
int head,tail;
int i,j,k,n,m,sx,sy,ex,ey,tx,ty,flag;
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
scanf("%d",&a[i][j]);
scanf("%d%d%d%d",&sx,&sy,&ex,&ey);
head=1; tail=1;//队列初始化
que[tail].x=sx;
que[tail].y=sy;
que[tail].s=0;
tail++;
book[sx][sy]=1;
flag=0;
while(head<tail)
{
for(k=0;k<4;k++)
{
tx=que[head].x+next[k][0];
ty=que[head].y+next[k][1];
if(tx<1||tx>n||ty<1||ty>m)
continue;
if(a[tx][ty]==0&&book[tx][ty]==0)
{
book[tx][ty]=1;
que[tail].x=tx;
que[tail].y=ty;
que[tail].s=que[head].s+1;
tail++;
}
if(tx==ex&&ty==ey)
{
flag=1;
break;
}
}
if(flag==1)
break;
head++;
}
printf("%d",que[tail-1].s);//tail指向队列队尾的下一个位置,所以需要-1.
return 0;
}