DFS+回溯
最开始的代码:
在拐角处有奇怪的错误
#include <stdio.h>
#define esp 1e-8
#include <string.h>
#include <algorithm>
using namespace std;
int steps[26];//坐标都只有一位数 直接存储
int now[26];
int vis[6][6];
char maps[6][6];
int ans;
void dfs(int x,int y,int step)
{
if (x == 4&&y == 4)
{
if (step < ans)
{
for (int i = 0 ;i <step;i++)
{
ans = step;
steps[i] = now[i];
}
}
}
if (x >= 5||y >= 5||x<0||y<0||vis[x][y] == 1||
maps[x][y] == 1||step +(4-x)+(4-y)>= ans ) return;//特判条件
else
{
vis[x][y] = 1;
now[step] = x*10+y;
for (int i = -1; i <= 1;i++)
{
for (int j = -1 ;j <= 1;j++)
{
dfs(x+i,y+j,step+1);
}
}
vis[x][y] = 0;
}
}
int main()
{
for (int i = 0;i <5 ;i++)
{
for (int j = 0;j<5;j++)
scanf("%d",&maps[i][j]);
}
ans = 20;
dfs(0,0,0);
for (int i = 0 ; i < ans;i++)
{
printf("(%d, %d)\n",steps[i]/10,steps[i]%10);
if ((steps[i]/10-steps[i+1]/10==1||steps[i]/10-steps[i+1]/10==-1)
&&(steps[i]%10-steps[i+1]%10==1||steps[i]%10-steps[i+1]%10==-1))
{
if(maps[steps[i]/10][steps[i+1]%10] == 1)
{
printf("(%d, %d)\n",steps[i+1]/10,steps[i]%10);
continue;
}
else
{
printf("(%d, %d)\n",steps[i]/10,steps[i+1]%10);
continue;
}
}
}
printf("(4, 4)");
return 0;
}
后来发现,在进入下一个深搜的地方少了一个条件判断。
#include <stdio.h>
#define esp 1e-8
#include <string.h>
#include <algorithm>
using namespace std;
int steps[26];
int now[26];
int vis[6][6];
char maps[6][6];
int ans;
void dfs(int x,int y,int step)
{
if (x == 4&&y == 4)
{
if (step < ans)
{
for (int i = 0 ;i <step;i++)
{
ans = step;
steps[i] = now[i];
}
}
}
if (x >= 5||y >= 5||x<0||y<0||vis[x][y] == 1||
maps[x][y] == 1||step +(4-x)+(4-y)>= ans ) return;//特判条件
else
{
vis[x][y] = 1;
now[step] = x*10+y;
for (int i = -1; i <= 1;i++)
{
for (int j = -1 ;j <= 1;j++)
{
if(i==0||j==0)
dfs(x+i,y+j,step+1);
}
}
vis[x][y] = 0;
}
}
int main()
{
for (int i = 0;i <5 ;i++)
{
for (int j = 0;j<5;j++)
scanf("%d",&maps[i][j]);
}
ans = 20;
dfs(0,0,0);
for (int i = 0 ; i < ans;i++)
{
printf("(%d, %d)\n",steps[i]/10,steps[i]%10);
}
printf("(4, 4)");
return 0;
}