题解 洛谷P1913 【L国的战斗之伞兵】
很适合搜索入门
我竟然交了三次才过
此题用搜索
请原谅,我习惯把数组名叫DP
1.用一个数组DP[i][j]记录点(i,j)是否可行,这样可以避免很多的重复运算。初始化时将所有无风区设为true,其余设为false。
2.别看代码长,其实四个方向都很类似。
3.从每个点进去搜一遍。
4.搜索题小心出界。
#include<bits/stdc++.h> using namespace std; int n,m; bool vis[1001][1001]; bool dp[1001][1001]; char a[1001][1001]; bool dfs(int x,int y) { if(dp[x][y]) { return true; } switch(a[x][y]) { case 'u': { if(!vis[x-1][y]&&x>0&&y>0&&x<=n&&y<=m) { vis[x-1][y]=true; if(dfs(x-1,y)) { dp[x][y]=true; vis[x-1][y]=false; return true; } vis[x-1][y]=false; } break; } case 'd': { if(!vis[x+1][y]&&x>0&&y>0&&x<=n&&y<=m) { vis[x+1][y]=true; if(dfs(x+1,y)) { dp[x][y]=true; vis[x+1][y]=false; return true; } vis[x+1][y]=false; } break; } case 'l': { if(!vis[x][y-1]&&x>0&&y>0&&x<=n&&y<=m) { vis[x][y-1]=true; if(dfs(x,y-1)) { dp[x][y]=true; vis[x][y-1]=false; return true; } vis[x][y-1]=false; } break; } case 'r': { if(!vis[x][y+1]&&x>0&&y>0&&x<=n&&y<=m) { vis[x][y+1]=true; if(dfs(x,y+1)) { dp[x][y]=true; vis[x][y+1]=false; return true; } vis[x][y+1]=false; } break; } } return false; } int main() { int i,j; cin>>n>>m; for(i=1;i<=n;i++) { for(j=1;j<=m;j++) { cin>>a[i][j]; if(a[i][j]=='o') { dp[i][j]=true; } } } int sum=0; for(i=1;i<=n;i++) { for(j=1;j<=m;j++) { vis[i][j]=true; if(dfs(i,j)) { dp[i][j]=true; sum++; } vis[i][j]=false; } } cout<<sum<<endl; return 0; } /* 5 5 rrrrr rdddr rroll uuuuu uuuuu */
不要妄图追上西坠的太阳,而是要在黎明前就等着它!