DFS记录路径较简单,每次遍历到时都会被更改 DFS用于寻找可行解
#include<stdio.h>
#include<string.h>
int map[50][50];
int dir[8][2]={{-2,-1},{-2,1},{-1,-2},{-1,2},{1,-2},{1,2},{2,-1},{2,1}};
struct node
{
int x,y;
};
int path[30][2];
int n,m;
int flag=0;
node start;
bool dfs(node start,int step)
{
node cur;
if(step==n*m)
{
flag=1;
return 1;
}
for(int i=0;i<8;i++)
{
cur.x=start.x+dir[i][0];
cur.y=start.y+dir[i][1];
if(cur.x>=1&&cur.x<=m&&cur.y>=1&&cur.y<=n&&map[cur.x][cur.y]==0)
{
map[cur.x][cur.y]=1;
path[step][0]=cur.x+'A'-1;
path[step][1]=cur.y+'0';
dfs(cur,step+1);
if(flag)
return 1;
map[cur.x][cur.y]=0;
}
}
return 0;
}
int main()
{
int t;
scanf("%d",&t);
for(int ii=1;ii<=t;ii++)
{
scanf("%d%d",&n,&m);
memset(map,0,sizeof(map));
memset(path,0,sizeof(path));
flag=0;
path[0][0]='A';
path[0][1]='1';
start.x=1;
start.y=1;
map[1][1]=1;
printf("Scenario #%d:\n",ii);
if(dfs(start,1))
{
for(int i=0;i<n*m;i++)
{
printf("%c%c",path[i][0],path[i][1]);
}
printf("\n");
}
else
printf("impossible\n");
if(ii!=t)
printf("\n");
}
return 0;
}
TOJ 3520 BFS+记录路径 BFS主要用于寻找最优解
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
int map[200][200];
int n,m;
struct node
{
int x,y,t;
};
node path[200][200];
node road[200];
int l;
node start,target;
int bfs(node start)
{
queue<node> q;
q.push(start);
map[start.x][start.y]=1;
while(!q.empty())
{
node cur=q.front();
q.pop();
node next;
if(cur.x==1||cur.x==n||cur.y==1||cur.y==m)
{
target.x=cur.x;
target.y=cur.y;
return cur.t;
}
for(int i=0;i<4;i++)
{
next.x=cur.x+dir[i][0];
next.y=cur.y+dir[i][1];
if(next.x>0&&next.x<=n&&next.y>0&&next.y<=m&&map[next.x][next.y]==0)
{
next.t=cur.t+1;
path[next.x][next.y].x=cur.x;
path[next.x][next.y].y=cur.y;
map[next.x][next.y]=1;
q.push(next);
}
}
}
return -1;
}
void print(int x,int y)
{
if(x==start.x&&y==start.y)
{
road[l].x=x;
road[l++].y=y;
return;
}
print(path[x][y].x,path[x][y].y);
road[l].x=x;
road[l++].y=y;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
int i,j;
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
scanf("%d",&map[i][j]);
}
}
int xi,yi;
scanf("%d%d",&xi,&yi);
start.x=xi;
start.y=yi;
start.t=1;
l=1;
int ans=bfs(start);
print(target.x,target.y);
for(i=1;i<l-1;i++)
{
if(road[i+1].x-road[i].x==1&&(road[i+1].y==road[i].y))
printf("D ");
if(road[i+1].x-road[i].x==-1&&(road[i+1].y==road[i].y))
printf("U ");
if(road[i+1].y-road[i].y==1&&(road[i+1].x==road[i].x))
printf("R ");
if(road[i+1].y-road[i].y==-1&&(road[i+1].x==road[i].x))
printf("L ");
}
if(road[l-1].x==n)
printf("D");
if(road[l-1].x==1)
printf("U");
if(road[l-1].y==1)
printf("L");
if(road[l-1].y==m)
printf("R");
printf("\n");
}
return 0;
}