90分求加剪枝/卡常
查看原帖
90分求加剪枝/卡常
186034
封禁用户楼主2020/5/29 16:47
#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

2020/5/29 16:47
加载中...