#include<iostream>
#define MAXW 10
#define MAXL 9
#define OVERFLOW MAXW*MAXL+1
using namespace std;
int dp[MAXW+2][MAXL+2];
bool visited[MAXW+2][MAXL+2];
int dir[8][2]={
{3,2},
{2,3},
{-3,2},
{-2,3},
{3,-2},
{2,-3},
{-3,-2},
{-2,-3}
};
bool check(int x,int y){
if (x<1||x>10) return false;
if (y<1||y>9) return false;
if (x==1&&y==4) return false;
if (x==1&&y==6) return false;
if (x==2&&y==5) return false;
return true;
}
int dfs_try(int x,int y){
if (!check(x,y)) return OVERFLOW;
if (visited[x][y]) return OVERFLOW;
if (dp[x][y]!=-1) return dp[x][y];
dp[x][y]=OVERFLOW;
visited[x][y]=true;
for (int i=0;i<8;i++){
int way=dfs_try(x+dir[i][0],y+dir[i][1])+1;
if (way<dp[x][y]) dp[x][y]=way;
}
visited[x][y]=false;
return dp[x][y];
}
int main (void){
memset(dp,-1,sizeof(dp));
memset(visited,false,sizeof(visited));
dp[1][5]=0;
int x,y;cin>>x>>y;
int ans=dfs_try(x,y);
if (ans==OVERFLOW) cout<<"No Answer";
else cout<<ans;
//while (1);
return 0;
}
/*
2 2
----
2
*/
WA 1
#include<iostream>
#define MAXW 10
#define MAXL 9
#define OVERFLOW MAXW*MAXL+1
using namespace std;
int dp[MAXW+2][MAXL+2];
bool visited[MAXW+2][MAXL+2];
int dir[8][2]={
{1,2},
{2,1},
{-1,2},
{-2,1},
{1,-2},
{2,-1},
{-1,-2},
{-2,-1}
};
bool check(int x,int y){
if (x<1||x>10) return false;
if (y<1||y>9) return false;
if (x==1&&y==4) return false;
if (x==1&&y==6) return false;
if (x==2&&y==5) return false;
return true;
}
int dfs_try(int x,int y){
if (!check(x,y)) return OVERFLOW;
if (visited[x][y]) return OVERFLOW;
if (dp[x][y]!=-1) return dp[x][y];
dp[x][y]=OVERFLOW;
visited[x][y]=true;
for (int i=0;i<8;i++){
int way=dfs_try(x+dir[i][0],y+dir[i][1])+1;
if (way<dp[x][y]) dp[x][y]=way;
}
visited[x][y]=false;
return dp[x][y];
}
int main (void){
memset(dp,-1,sizeof(dp));
memset(visited,false,sizeof(visited));
dp[1][5]=0;
int x,y;cin>>x>>y;
int ans=dfs_try(x,y);
if (ans==OVERFLOW) cout<<"No Answer";
else cout<<ans;
//while (1);
return 0;
}
/*
2 2
----
2
*/