题解 P1535 【游荡的奶牛】
Space_Gold_Trash · · 题解
才发现普及+的题如此简单...完全刷新对普及+的印象
今天不知A了多少绿题了
步入正题
思路历程
普通爆搜思路
这题普通爆搜思路很好想
总而言之就是在规定的步数T内
有几种从出发点到目标点的方法
首先从出发点开始搜
向上下左右四个方向搜索(很显然的说)
那么就只要到达目的地ans++
这是一个40分程序
#include<iostream>
using namespace std;
int n,m,t,x1,y1,x2,y2;
int X[4]={1,-1,0,0},Y[4]={0,0,1,-1};
bool ok[110][110];
int ans;
inline bool pd(int x,int y){
if(x>=1&&x<=n&&y>=1&&y<=m)
if(ok[x][y])return 1;
return 0;
}
inline void dfs(int x,int y,int time){
if(x==x2&&y==y2&&time==0)ans++;
if(!time)return;
int i;
for(i=0;i<4;i++)
if(pd(x+X[i],y+Y[i]))
dfs(x+X[i],y+Y[i],time-1);
}
int main( ){
std::ios::sync_with_stdio(false);
cin>>n>>m>>t;
int i,j,k;
char c;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++){cin>>c;if(c=='.')ok[i][j]=1;else ok[i][j]=0;}
cin>>x1>>y1>>x2>>y2;
dfs(x1,y1,t);
cout<<ans;
}
很显然普通的爆搜是注定要T的
那么须要一个剪枝
可行性剪枝:如果在T次之内无法到达目的地
return
下面是90分程序
#include<iostream>
using namespace std;
int n,m,t,x1,y1,x2,y2;
int X[4]={1,-1,0,0},Y[4]={0,0,1,-1};
bool ok[110][110];
int ans;
inline bool pd(int x,int y){
if(x>=1&&x<=n&&y>=1&&y<=m)
if(ok[x][y])return 1;
return 0;
}
inline int abs(int s){
if(s<0)return -s;
return s;
}
inline void dfs(int x,int y,int time){
if(x==x2&&y==y2&&time==0)ans++;
if(!time||abs(x-x2)+abs(y-y2)>time)return;
int i;
for(i=0;i<4;i++)
if(pd(x+X[i],y+Y[i]))
dfs(x+X[i],y+Y[i],time-1);
}
int main( ){
std::ios::sync_with_stdio(false);
cin>>n>>m>>t;
int i,j,k;
char c;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++){cin>>c;if(c=='.')ok[i][j]=1;else ok[i][j]=0;}
cin>>x1>>y1>>x2>>y2;
dfs(x1,y1,t);
cout<<ans;
}
找了许久(3分钟)
发现过多次调用函数 is a waste of time
只要删除pd函数就AC了
100分程序
#include<iostream>
using namespace std;
int n,m,t,x1,y1,x2,y2;
int X[4]={1,-1,0,0},Y[4]={0,0,1,-1};
bool ok[110][110];
int ans;
inline int abs(int s){
if(s<0)return -s;
return s;
}
inline void dfs(int x,int y,int time){
if(x==x2&&y==y2&&time==0)ans++;
if(!time||abs(x-x2)+abs(y-y2)>time)return;
int i;
for(i=0;i<4;i++)
if(x>=1&&x<=n&&y>=1&&y<=m&&ok[x][y])
dfs(x+X[i],y+Y[i],time-1);
}
int main( ){
std::ios::sync_with_stdio(false);
cin>>n>>m>>t;
int i,j,k;
char c;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++){cin>>c;if(c=='.')ok[i][j]=1;else ok[i][j]=0;}
cin>>x1>>y1>>x2>>y2;
dfs(x1,y1,t);
cout<<ans;
}
人走可以,把赞留下