题目:Jumping Haybales(跳格子)
题目链接:http://exam.upc.edu.cn/problem.php?cid=1293&pid=3
给定了N×N的格子,里面 ' . ' 可以走,而 ' # ' 是不可以走的。
给定了K,而K的值是可以走的最大步数。(就是一口气可以跳到k的距离而算一步)。
起点是左上角,终点是右下角。请问要是能到达就输出步数来,
要是不能到达就输出-1。
这个题:当一开始全世界都认为可以BFS时,我就看了看过了的人,其实AC的人之前都是错误的,而不是超时的。
所以我一开始跟队友说肯定不是BFS,应该是DP之类的,而队友一口否认,并不断修正自己的BFS,我真的很苦恼,
直到结束后,别的队都说是用DP过的,我直接原地爆炸了。怪就怪自己之前没有认真学一下DP,也没有好好推过DP式子)
最应该好好检讨一下的是自己写不出来,而不能一向怪队友,自己没实力才是根本原因。
题解:这题DP 就是dp[i][j]=min(dp[i-k][j]+1,dp[i][j-k]+1).
但是要注意小细节, 因为从一个区间里,1~k也算是一步。所以要用一下for循环历遍一下左边和上边。
最后更新当行和当列的 最后的位置。参考了学长的代码(LK)的做法,不然我在无限陷入怎么更新值里。
#include<bits/stdc++.h>
using namespace std;
char a[2005][2005];
int X[2005],Y[2005];
int dp[2005][2005];
int main()
{
int n,k;
scanf("%d%d",&n,&k);
for(int i=0;i<n;i++){
scanf("%s",a[i]);
}
memset(X,0,sizeof(X));
memset(Y,0,sizeof(Y));
memset(dp,127,sizeof(dp));
X[0]=0,Y[0]=0;
dp[0][0]=0;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(a[i][j]=='.'){
for(;Y[i]<j;Y[i]++){
if(a[i][Y[i]]=='.'&&j-Y[i]<=k){
break;
}
}
dp[i][j]=min(dp[i][j],dp[i][Y[i]]+1);
for(;X[j]<i;X[j]++){
if(a[X[j]][j]=='.'&&i-X[j]<=k){
break;
}
}
dp[i][j]=min(dp[i][j],dp[X[j]][j]+1);
if(dp[X[j]][j]>=dp[i][j]){
X[j]=i;
}if(dp[i][Y[i]]>=dp[i][j]){
Y[i]=j;
}
}
}
}
/*for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
printf("%d%c",dp[i][j],j==n-1?'\n':' ');
}
}*/
if(dp[n-1][n-1]==2139062143){
printf("-1\n");
}else{
printf("%d\n",dp[n-1][n-1]);
}
return 0;
}