求助DFS思路哪里错了(未剪枝)

P3956 [NOIP2017 普及组] 棋盘

@[Maysoul](/user/409774) 不解释代码意思谁给你看啊
by Bright1 @ 2023-04-16 09:45:50


@[stalx_awa](/user/741959) ``` #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);//从起点开始DFS if(ans==MAXN) { cout<<"-1"<<endl; } else { cout<<ans<<endl; } return 0; } ``` 感谢您的指出,已为您写出了DFS基本逻辑的注释,还请您不吝赐教
by Maysoul @ 2023-04-16 09:52:11


@[Maysoul](/user/409774) 这样存颜色,无色和红色都是0。
by Bright1 @ 2023-04-16 09:58:12


@[stalx_awa](/user/741959) main里第一行memset(vis,-1,sizeof(vis)); 无色的地方是-1
by Maysoul @ 2023-04-16 09:59:59


@[Maysoul](/user/409774) 若当前点无色,`vis[i][j]==color` 这两个都是 `-1`,那不就走不成也走了。
by Bright1 @ 2023-04-16 10:09:05


@[stalx_awa](/user/741959) color永远也不可能是-1呢亲 因为: 当color返回上一次的color的时候,上一次的color只可能是最初的color,颜色不同改变后的color,无色时的color 其中: 最初的color就是起点的颜色,数据保证起点有颜色 颜色不同改变后的color条件是vis[np.r][np.c]!=-1 所以它不会是-1 至于无色时 它只返回0和1,不会返回-1
by Maysoul @ 2023-04-16 10:15:10


@[stalx_awa](/user/741959) 怎么,写上注释也没人帮我看吗?
by Maysoul @ 2023-04-16 16:55:18


马上
by _Francis_ @ 2023-04-16 18:14:32


@[Maysoul](/user/409774) 现在有事
by _Francis_ @ 2023-04-16 18:14:53


@[Maysoul](/user/409774) 一方面是**没有剪枝**所以会超时,还有就是**逻辑上存在一点bug**,我等一下改一下
by _Francis_ @ 2023-04-16 18:42:26


| 下一页