Здравствуйте, adontz, Вы писали:
A>Дана шахматная доска 8х8 клеток
A>В левом нижнем углу король
A>Он может двигаться вверх, вправо или вверх и вправо по диагонали
A>Слолько различных путей у короля из левого нижнего угла в правый верхний если он не совершает более 3 движений подряд в одном и том же направлении ?
А с рекурсией пожалуй покрасивей будет, да и результат посолидней: 12389303
#include <stdio.h>
#include <vector>
using namespace std;
void Step(int x, int y);
void OutputPath();
vector<pair<int, int> > Path;
int N, M, Count;
void main(int argc, char* argv[])
{
if(argc!=3){
printf("argv[1] - Table size\n");
printf("argv[2] - Max step\n");
return;
}
N = atoi(argv[1]);
M = atoi(argv[2]);
Count = 0;
Step(0, 0);
printf("%d\n", Count);
}
void Step(int x, int y)
{
int i;
if(x==N && y==N){
// OutputPath();
Count++;
return;
}
else{
for(i=1; i<=N-x && i<=M; i++){
Path.push_back(pair<int, int>(x + i, y));
Step(x + i, y);
Path.pop_back();
}
for(i=1; i<=N-y && i<=M; i++){
Path.push_back(pair<int, int>(x, y + i));
Step(x, y + i);
Path.pop_back();
}
for(i=1; i<=N-x && i<=N-y && i<=M; i++){
Path.push_back(pair<int, int>(x + i, y + i));
Step(x + i, y + i);
Path.pop_back();
}
}
}
void OutputPath()
{
static int line=0;
printf("%7d: ", ++line);
for(int i=0; i< Path.size(); i++){
printf("(%2d, %2d) ", Path[i].first, Path[i].second);
}
printf("\n");
}