来源:https://www.luogu.org/problemnew/show/P2802
1.每次移动不要改原变量,最好新建一个变量
2.xue1=7。。。。。。。后面有减一
3.以后写dfs最好不要有返回值,较难剪枝。。。
#include <cstdio>
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
int n,m,x,y,t1;
int a[15][15],tr[15][15];
int move[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
int dfs(int x1,int y1,int xue)
{
int i,x2,y2,ans=100000,t,xue1;
if (xue==0)
return -1;
if (a[x1][y1]==3)
return 0;
for (i=0;i<4;i++)
{
xue1=xue; //! ! ! ! ! !
x2=x1+move[i][0];
y2=y1+move[i][1];
if (x2<0 || y2<0 || x2>=n || y2>=m)
continue;
if (a[x2][y2]==0 || tr[x2][y2]!=0)
continue;
else if (a[x2][y2]==4 && xue!=1) //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
xue1=7; //!!!!!!!!!!!!!!!!!!!!!!!!!!!
tr[x2][y2]=1;
t=dfs(x2,y2,xue1-1);
tr[x2][y2]=0;
if (t!=-1)
ans=min(ans,t+1);
}
if (ans==100000)
return -1;
return ans;
}
int main()
{
int i,j;
freopen("a.txt","r",stdin);
scanf("%d%d",&n,&m);
for (i=0;i<n;i++)
{
for (j=0;j<m;j++)
{
scanf("%d",&a[i][j]);
if (a[i][j]==2)
{
x=i;
y=j;
}
}
}
memset(tr,0,sizeof(tr));
tr[x][y]=1;
t1=dfs(x,y,6);
printf("%d",t1);
return 0;
}
剪枝后。。。(dfs加一个步数,当大于已知结果stop)
#include <cstdio>
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
int n,m,x,y,t1,ans1=1000000;
int a[15][15],tr[15][15];
int move[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
void dfs(int x1,int y1,int xue,int tot)
{
int i,x2,y2,ans=100000,t,xue1;
if (xue==0)
return ;
if (a[x1][y1]==3)
{
ans1=min(ans1,tot);
return ;
}
if (tot>ans1)
return ;
for (i=0;i<4;i++)
{
xue1=xue;
x2=x1+move[i][0];
y2=y1+move[i][1];
if (x2<0 || y2<0 || x2>=n || y2>=m)
continue;
if (a[x2][y2]==0 || tr[x2][y2]!=0)
continue;
else if (a[x2][y2]==4 && xue!=1)
xue1=7;
tr[x2][y2]=1;
dfs(x2,y2,xue1-1,tot+1);
tr[x2][y2]=0;
}
return ;
}
int main()
{
int i,j;
freopen("a.txt","r",stdin);
scanf("%d%d",&n,&m);
for (i=0;i<n;i++)
{
for (j=0;j<m;j++)
{
scanf("%d",&a[i][j]);
if (a[i][j]==2)
{
x=i;
y=j;
}
}
}
memset(tr,0,sizeof(tr));
tr[x][y]=1;
dfs(x,y,6,0);
if (ans1!=1000000)
printf("%d",ans1);
else
printf("-1");
return 0;
}