30 pts QAQ

P1605 迷宫

@[QAQ_juruo](/user/1098781) 我翻了翻讨论版看到[这个](https://www.luogu.com.cn/discuss/736927) 粗略看了下,看起来您既没有标记起点已访问,也没有验证终点是否为障碍物
by Shen_Linwood @ 2024-01-11 18:12:56


@[Shen_Linwood](/user/480444) ``` int main(){ cin>>n>>m>>t; cin>>sx>>sy>>fx>>fy; cric(1,t){ int x,y; cin>>x>>y; dt[x][y]=0; } bj[sx][sy]=1;//this dfs(sx,sy); cout<<ans; return 0; } ``` 但是验证终点是否为障碍物具体怎么写QAQ
by QAQ_juruo @ 2024-01-12 12:58:35


@[QAQ_juruo](/user/1098781) 很好写,只要在开头特判一下 `dt[fx][fy]` 是否为 0,输出 0 即可
by Shen_Linwood @ 2024-01-12 15:51:23


当然也有可能是别的问题(? 我要去上文化课了,有空再看(
by Shen_Linwood @ 2024-01-12 15:52:34


@[Shen_Linwood](/user/480444) ```#include<iostream> #define cric(a,b) for(int i=(a);i<=(b);i++) using namespace std; long long dt[11][11]={1},ans; bool bj[11][11]={0}; int n,m,t,sx,sy,fx,fy; void dfs(int x,int y){ bj[sx][sy]=1;//起点标记 if(x==fx&&y==fy){ ans++; return; } if(bj[x+1][y]==0&&dt[x+1][y]){ bj[x][y]=1; dfs(x+1,y); bj[x][y]=0; } if(bj[x-1][y]==0&&dt[x-1][y]){ bj[x][y]=1; dfs(x-1,y); bj[x][y]=0; } if(bj[x][y+1]==0&&dt[x][y+1]){ bj[x][y]=1; dfs(x,y+1); bj[x][y]=0; } if(bj[x][y-1]==0&&dt[x][y-1]){ bj[x][y]=1; dfs(x,y-1); bj[x][y]=0; } } int main(){ cin>>n>>m>>t; cin>>sx>>sy>>fx>>fy; cric(1,t){ int x,y; cin>>x>>y; dt[x][y]=1; } bj[sx][sy]=1; dfs(sx,sy); if(dt[fx][fy]==0)cout<<0; else cout<<ans; return 0; } ``` 为什么还是30(?
by QAQ_juruo @ 2024-01-12 18:02:59


啊这…… 那就麻烦了 我看看
by Shen_Linwood @ 2024-01-12 19:16:35


@[QAQ_juruo](/user/1098781) 调了一下,您没写边界判断,就是说会搜到迷宫的外面去
by Shen_Linwood @ 2024-01-12 20:03:04


还有,`dt[11][11]={1}` 只将 `dt[0][0]` 赋值为 1,其他都还是 0 简单的修改方法是反过来,初始为 0,用 1 表示障碍;如果一定要初始为 1,可以用 `memset()` 或者 for 循环
by Shen_Linwood @ 2024-01-12 20:07:10


然后,边界判断的写法类似这样 ``` cpp bool check(int x,int y){ return x>0&&x<=n&&y>0&&y<=m; } ```
by Shen_Linwood @ 2024-01-12 20:11:30


|