求助DFS思路哪里错了(未剪枝)
查看原帖
求助DFS思路哪里错了(未剪枝)
409774
Maysoul楼主2023/4/16 09:12

代码如下: 样例都过不去

#include<bits/stdc++.h>
using namespace std;
const int MAXN=1e6+10;
int num,ans=MAXN;
bool grid[110][110];
int vis[110][110];
int n,m;
int x,y,c;
struct point{
    int r,c;
    point()
    {
        r=0;c=0;
    }
    point(int ar,int cr)
    {
        r=ar,c=cr;
    }
    point friend operator + (point a,point b)
    {
        return point(a.r+b.r,a.c+b.c);
    }
};
point offset[4]={point(0,1),point(0,-1),point(1,0),point(-1,0)};
void dfs(point cp,int coin,int color,bool flag)//当前点的坐标 当前金币数量 当前颜色 是否使用魔法 
{
	if (cp.r==m&&cp.c==m)
	{
		//cout<<coin<<" "<<color<<endl;
		ans=min(ans,coin);
		return;
	}
	for (int i=0;i<4;i++)
	{
		point np=cp+offset[i];
        if(0<np.r&&np.r<=m&&0<np.c&&np.c<=m&&grid[np.r][np.c]==0)
        {
        	if(vis[np.r][np.c]==color)
        	{
        		grid[np.r][np.c]=1;
        		//cout<<"a"<<endl;
	            dfs(np,coin,color,0);
	            grid[np.r][np.c]=0;
			}
			else if(vis[np.r][np.c]!=-1)
			{
				grid[np.r][np.c]=1;
				//cout<<"b"<<endl;
				dfs(np,coin+1,vis[np.r][np.c],0);
				grid[np.r][np.c]=0;
			}
			else if(flag==0)
			{
				grid[np.r][np.c]=1;
				//cout<<"c"<<endl;
				dfs(np,coin+2,1,1);
				dfs(np,coin+2,0,1);
				grid[np.r][np.c]=0;
			}
        }
	}
	
}
int main()
{
	memset(vis,-1,sizeof(vis));
	cin>>m>>n;
	int x,y,c;
	for (int i=1;i<=n;i++)
	{
		cin>>x>>y>>c;
		vis[x][y]=c;
	}
	grid[1][1]=1;
	dfs(point(1,1),0,vis[1][1],0);
	if(ans==MAXN)
	{
		cout<<"-1"<<endl;
	}
	else
	{
		cout<<ans<<endl;
	}
	return 0;
}
2023/4/16 09:12
加载中...