Re: Непостоянный король
От: 3.14159.. Израиль  
Дата: 26.04.03 10:31
Оценка:
Здравствуйте, 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");
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.