思路:将车动的两步,转换成人动两步。再进行DFS搜索,记得标记!
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
int n,k;
int sx,sy;
char line[4][110];
bool flag;
bool f[4][110];
void dfs( int x,int y ) {
if( flag )
return ;
if ( y>=n-1 ) {
flag = true; return ;
}
int tx,ty;
tx = x;
ty = y+1;
if ( line[tx][ty]=='.' ) {
for ( int i=0; i<3; i++ ) {
tx = x+i-1;
if ( tx>=0 && tx<3 && line[tx][ty]=='.' ) {
if ( (line[tx][ty+1]=='.' ||line[tx][ty+1]==0 )
&& (line[tx][ty+2]=='.' ||line[tx][ty+2]==0 ) ) {
if (f[tx][ty+2]==false ) {
f[tx][ty+2] = 1;
dfs(tx,ty+2);
}
}
}
}
}
return ;
}
void init(int len) {
for ( int i=0; i<3; i++ ) {
for ( int j=0; j<len+5; j++ )
line[i][j] = '.';
}
flag = false;
memset(f,false,sizeof(f));
}
int main (void) {
int tests;
scanf("%d",&tests);
while ( tests-- ) {
scanf("%d%d",&n,&k);
init(n);
for ( int i=0; i<3;i++ ) {
scanf("%s",&line[i]);
for ( int j=0; j<n; j++ ) {
if ( line[i][j]=='s' ) {
sx = i; sy = j;
}
}
}
f[sx][sy] = 1;
dfs(sx,sy);
if ( flag ) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return 0;
}
动态规划的做法:
dp[i][j] 代表第i层第j个位置能否走到
因为一下走四个位置,所以最后判断是要判断这四个位置。
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
int n,k;
int sx,sy;
char line[5][110];
int dp[5][110];
bool flag;
int main (void) {
int tests;
scanf("%d",&tests);
while ( tests-- ) {
scanf("%d%d",&n,&k);
memset(dp,0,sizeof(dp));
for ( int i=1; i<n+5; i++ ) {
for ( int j=1; j<=3; j++ )
line[j][i] = '.';
}
flag = false;
for ( int i=1; i<=3;i++ ) {
scanf("%s",&line[i]);
for ( int j=0; j<n; j++ ) {
if ( line[i][j]=='s' ) {
sx = i; sy = j;
}
}
}
dp[sx][sy] = 1;
for ( int j=3; j<=n+2; j+=3 )
{
for ( int i=1; i<=3; i++ ) {
if ( ( line[i][j-1]=='.'|| line[i][j-1]=='\0' ) &&
( line[i][j]=='.' || line[i][j]=='\0' ) &&
( line[i][j-2]=='.' || line[i][j-2]=='\0' )
) {
if (
( dp[i][j-3] && ( line[i][j-2]=='.' ||line[i][j-2]=='\0' ) )
||(dp[i-1][j-3] && ( line[i-1][j-2]=='.' ||line[i-1][j-2]=='\0' ))
||(dp[i+1][j-3] && ( line[i+1][j-2]=='.' ||line[i+1][j-2]=='\0' ))
){
dp[i][j] = 1;
}
}
}
}
for ( int i=1; i<=3; i++ ) {
for ( int j=n-1; j<=n+2; j++ ) {
if ( dp[i][j] ) flag = 1;
}
}
if ( flag ) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return 0;
}