神奇的做法,但T飞

P1189 SEARCH

我寻思它也没法剪枝啊
by __Xiao__ @ 2022-10-11 14:24:42


如果同一时刻到达同一个点就只需要搜一次这个点
by Saliva_Yan @ 2022-10-11 15:01:36


@[__Xiao__](/user/727563) ``` int vis[1001][51][51]; ``` ``` if(vis[p][x][y])return ; vis[p][x][y]=1; ``` 把这几句加上就能A 全部代码 ``` #include<bits/stdc++.h> using namespace std; int n,m,q; char a[51][51],b[51][51]; int vis[1001][51][51]; int f[3][10001]; int w[1001];//上->1,下->-1 ,左->-2,右->2 void dfs(int p,int x,int y){ if(vis[p][x][y])return ; vis[p][x][y]=1; if(p==q+1){ b[x][y]='*'; return ; } if(w[p]==1) { for(int i=x-1;i>=1;i--){ if(a[i][y]=='X')return ; dfs(p+1,i,y); } } else if(w[p]==-1) { for(int i=x+1;i<=n;i++){ if(a[i][y]=='X')return ; dfs(p+1,i,y); } } else if(w[p]==-2) { for(int j=y-1;j>=1;j--){ if(a[x][j]=='X')return ; dfs(p+1,x,j); } } else if(w[p]==2){ for(int j=y+1;j<=m;j++){ if(a[x][j]=='X')return ; dfs(p+1,x,j); } } return ; } int main(){ cin>>n>>m; int x,y; for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ cin>>a[i][j]; if(a[i][j]=='*')x=i,y=j; } } cin>>q; for(int i=1;i<=q;i++){ string s; cin>>s; if(s=="NORTH"){ w[i]=1; } else if(s=="WEST"){ w[i]=-2; } else if(s=="SOUTH"){ w[i]=-1; } else if(s=="EAST"){ w[i]=2; } } f[1][0]=x;f[2][0]=y; dfs(1,x,y); for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ if(b[i][j]=='*')cout<<'*'; else if(a[i][j]!='*') cout<<a[i][j]; else cout<<'.'; } cout<<"\n"; } return 0; } ```
by Saliva_Yan @ 2022-10-11 15:04:14


@[Saliva_Yan](/user/469784) 想通了,谢谢
by __Xiao__ @ 2022-10-11 15:12:34


@[Saliva_Yan](/user/469784) 这算增维吗
by __Xiao__ @ 2022-10-11 15:16:39


@[__Xiao__](/user/727563) zkx说不算,增维是动态规划里的东西
by Saliva_Yan @ 2022-10-11 15:18:37


@[Saliva_Yan](/user/469784) 但思想一样吧
by __Xiao__ @ 2022-10-11 15:20:30


多加一个状态
by __Xiao__ @ 2022-10-11 15:20:54


大概吧(
by Saliva_Yan @ 2022-10-11 15:22:28


@[Saliva_Yan](/user/469784) vis数组 用bool[WA](https://www.luogu.com.cn/record/89452951)了 用int[RE](https://www.luogu.com.cn/record/89453224)了 但加上那个屁用没有的f数组就过了[AC](https://www.luogu.com.cn/record/89453489),换成bool还更快了
by __Xiao__ @ 2022-10-11 15:38:47


| 下一页