Skip to content

Instantly share code, notes, and snippets.

@sjchmiela
Created December 11, 2013 09:43
Show Gist options
  • Save sjchmiela/7907658 to your computer and use it in GitHub Desktop.
Save sjchmiela/7907658 to your computer and use it in GitHub Desktop.
#include <cstdio>
using namespace std;
int t[8][8] =
{
{9, 9, 9, 9, 5, 6, 7, 8},
{8, 8, 4, 3, 1, 1, 1, 1},
{7, 7, 5, 2, 1, 1, 1, 1},
{1, 6, 6, 1, 1, 1, 1, 1},
{1, 4, 5, 1, 5, 1, 1, 1},
{1, 3, 1, 4, 1, 4, 1, 1},
{1, 2, 3, 1, 1, 1, 3, 1},
{1, 1, 1, 2, 1, 1, 1, 1}
};
int result[64];
int distance(int from_x, int from_y, int to_x, int to_y)
{
return (to_x-from_x)*(to_x-from_x)+(to_y-from_y)*(to_y-from_y);
}
int move_x(int move, int x)
{
int dx[] = {0,1,1,1,0,-1,-1,-1};
return x + dx[move];
}
int move_y(int move, int y)
{
int dy[] = {1,1,0,-1,-1,-1,0,1};
return y + dy[move];
}
bool inBoard(int move, int x, int y)
{
return (move_x(move,x) >= 0 && move_x(move,x) < 8 && move_y(move,y) >= 0 && move_y(move,y) < 8);
}
bool moveSpelniaWarunkiZadania(int move, int x, int y, int to_x, int to_y)
{
if(!inBoard(move,x,y)) { return false; }
if(distance(x,y,to_x, to_y) < distance(move_x(move,x), move_y(move,y),to_x,to_y)) { return false; }
int lastDigitOfCurrent;
int firstDigitOfTarget;
lastDigitOfCurrent = t[x][y]%10;
firstDigitOfTarget = t[move_x(move,x)][move_y(move,y)];
while(firstDigitOfTarget/10 > 0)
{
firstDigitOfTarget /= 10;
}
return (lastDigitOfCurrent < firstDigitOfTarget);
}
bool ruszSie(int x, int y, int to_x, int to_y, int pos_to_save)
{
if(x == to_x && y == to_y) { return true; } // TEGO NIE NAPISAŁEM NA KARTKÓWCE. TYLKO.
for(int i = 0; i<8; i++)
{
if(moveSpelniaWarunkiZadania(i, x, y, to_x, to_y))
{
if(ruszSie(move_x(i,x), move_y(i,y), to_x, to_y,pos_to_save+1))
{
result[pos_to_save] = i;
printf("ending on (%d, %d) trying to get to (%d, %d)\n",x,y,to_x,to_y);
return true;
}
}
}
return false;
}
int czySieDa(int w, int k)
{
if(ruszSie(w, k, 0, 0, 0))
{
return 0;
}
if(ruszSie(w, k, 0, 7, 0))
{
return 1;
}
if(ruszSie(w, k, 7, 0, 0))
{
return 2;
}
if(ruszSie(w, k, 7, 7, 0))
{
return 3;
}
return -1;
}
int main()
{
printf("%d\n",czySieDa(6,2));
for(int i = 0; i<10; i++)
{
printf("%d ",result[i]);
}
printf("\n");
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment