#include<cstdio>
#include<queue>
#include<cstring>
#include<iostream>
using namespace std;
int n,m,q,p,minn,maxx,xxx,yyy;
int fx[4]={-1,1,0,0},
fy[4]={0,0,1,-1};
bool a[11][11],b[11][11];
int c[11][11],d[11][11];
struct node
{
int x,y,k;
};
queue<node> que;
void to_do()
{
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
d[i][j]=c[i][j];
return ;
}
void dfs(int xx,int yy,int kk)
{
if(d[xx][yy]>kk)
return ;
c[xx][yy]=kk;
if(xx==1&&yy==n)
{
if(kk>maxx)
{
maxx=kk;
memcpy(c,d,sizeof(d));
}
return ;
}
for(int i=0;i<4;++i)
{
xxx=xx+fx[i];yyy=yy+fy[i];
if(!xxx||!yyy||xxx>n||yyy>n||a[xxx][yyy])
continue;
a[xx][yy]=true;
dfs(xxx,yyy,kk+1);
a[xx][yy]=false;
}
return ;
}
int main()
{
scanf("%d%d",&n,&m);
while(m--)
{
scanf("%d%d",&q,&p);
a[q][p]=true;
b[q][p]=true;
}
a[n][1]=true;
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
d[i][j]=-1;
dfs(n,1,0);
node o;
o.x=n,o.y=1,o.k=0;
que.push(o);
while(!que.empty())
{
o=que.front();
que.pop();
if(o.x==1&&o.y==n)
{
minn=o.k;
break;
}
for(int i=0;i<4;++i)
{
xxx=o.x+fx[i];yyy=o.y+fy[i];
if(!xxx||!yyy||xxx>n||yyy>n||b[xxx][yyy])
continue;
b[xxx][yyy]=true;
que.push((node){xxx,yyy,o.k+1});
}
}
printf("%d\n",maxx-minn);
//cout<<maxx<<" "<<minn<<endl;
return 0;
}
加了剪枝,为啥没有任何效果/kel