题解 AT3875 【[ARC089A] Traveling】
发布于 2020-04-05
有生之年居然能够入门题WA,果然我太菜了
好,进入正题:
一开始我看到这样的题目,第一反应就是万能的dfs!
思路:搜索路线,由于求最短时间所以可以直接剪枝向左和向上。而求出最短时间比较即可。
代码分数:0
代码:
#include<bits/stdc++.h>
using namespace std;
int n,m,a[41][101],t,fl;
int flag=0;
//bool f[41][41];
int minn=1e9;
void dfs(int x,int y,int sum)//dfs
{
if(x<1||x>n||y<1||y>m) return;
if(x==n&&y==m) minn=min(minn,sum);
dfs(x+1,y,sum+1);
dfs(x,y+1,sum+1);
}
int main()
{
//ios::sync_with_stdio(false);
int i,j;
cin>>t;
while(t--)
{
minn=1e9;
cin>>fl>>n>>m;
dfs(1,1,0);
if(minn>fl||minn==0) flag=1;
//cout<<minn<<" "<<flag<<endl;
//else cout<<"No";
//cout<<endl;
}
if(flag) cout<<"No";
else cout<<"Yes";
//dfs(1,1,a[1][1]);
//cout<<maxx;
//system("pause");
return 0;
}
反思原因:求的是时间t时能否到达,而不是在时间t之前能否到达。
所以让我们再回过头来看看这道题,可以明显地发现其实所需时间就是x+y嘛!等等,还没完:时间大小判断了,那怎么知道t的时候到底能不能到达目的地呢?
经过模拟,可以清楚地发现:如果你要在t时间到达的话,最短时间到目的地后,可以不停地往回走一格再走回来,往回走一格再走回来......
所以,可以发现,只要剩余的时间mod2余数为0的时候,结果就一定能够到达!
代码:
#include<bits/stdc++.h>
using namespace std;
int n,m,t,fl;
int flag=0;
//bool f[41][41];
int minn=1e9;
void dfs(int x,int y,int sum)
{
if(sum>minn) return;
if(x<1||x>n||y<1||y>m) return;
if(x==n&&y==m) minn=min(minn,sum);
dfs(x+1,y,sum+1);
dfs(x,y+1,sum+1);
}
int main()
{
//ios::sync_with_stdio(false);
int i,j;
cin>>t;
while(t--)
{
cin>>fl>>n>>m;
if(n+m>fl) //时间太短,原地升天
{
flag=1;
break;
}
if((fl-n-m)%2==1) //走了不回,原地升天
{
flag=1;
break;//只要不行,直接走也
}
}
if(flag) cout<<"No";
else cout<<"Yes";
//dfs(1,1,a[1][1]);
//cout<<maxx;
//system("pause");
retun 0; //防止抄袭,抵抗之间
}
完结撒花~