Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Kenway
Сообщений: n/a
#1

Расставить на доске N ферзей так, чтобы они не били друг друга - C++

12.07.2013, 22:40. Просмотров 883. Ответов 1
Метки нет (Все метки)

смысл в том чтобы расставить на шахматной доске размером N*N, N ферзей так, чтобы они не били друг друна.
пыиался сделать что то методом перебора, но программа зависает. где здесь может быть ошибка?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#include <iostream>
#include <cmath>
using namespace std;
 
int num;
int q;
bool ext = false;
 
 
void show (int *array, int size);
void check (int *array, int size);
void cycle (int *array, int size);
 
 
 
 
 
void main ()
{
    cin>>num;
    int *mass = new int[num];
    cycle(mass, num);
    cin>>q;
}
 
 
void show (int *array, int size)
{
    for (int i=0; i<num; i++)
    {
        cout<<array[i];
    }
    cout<<endl;
}
 
 
 
 
 
void check (int *array, int size)
{
    for (int i=0; i<num; i++)
    {
        for (int j=i+1; j<num; j++)
        {
            if (array[i]==array[j])
            {
                return;
            }
        }
    }
    for (i=0; i<num; i++)
    {
        for (int j=i+1; j<num; j++)
        {
            if (abs(array[i]-array[j])==abs(i-j))
            {
                return;
            }
            if (abs((num-array[i])-(num-array[j]))==abs(i-j))
            {
                return;
            }
        }
    }
    show(array, num);
}
 
 
 
 
void cycle (int *array, int size)
{
    while (ext!=true)
    {
        array[0]++;
        for (int i=0; i<num; i++)
            if (array[i]==num)
            {
                array[i]=0;
                array[i+1]++;
            }
            check(array, num);
            if (array[num-1]==num)
            {
                ext = true;
            }
    }
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.07.2013, 22:40
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Расставить на доске N ферзей так, чтобы они не били друг друга (C++):

Рекурсивный алоритм шахматная доска расставить фигуры так чтобы не били друг друга - C++
На шахматной доске n x n,расставить фигуры так,чтобы они не били друг друга,нужно реализовать 2 отдельных программы,в первой фигуры...

Расставить 8 ферзей на шахматной доске 8 на 8, которые не бьют друг друга - C++
Нужно написать программу которая расставляет на шахматной доске 8 ферзей, которые не бьют друг друга. обязательно использование рекурсии,...

Сформировать все возможные варианты расстановки ферзей на поле, где они бы не били друг друга - C++
Помогите написать программу, которая сформирует все возможные варианты расстановки m (m&gt;3) ферзей на шахматной доске m х m клеток, при...

На шахматной доске расставлены три фигуры. Определить бьют они друг друга или нет - C++
На шахматной доске расставлены три фигуры. Используя стандартные правила игры узнать бьют они друг друга или нет. Расположение фигур...

Расстановка восьми ферзей на шахматной доске так, чтобы ни один не угрожал другому - C++
5. Расстановка восьми ферзей на шахматной доске так, чтобы ни один не угрожал другому.

Рекурсия: расставить 5 ферзей так, чтобы все поле 8*8 находилось под ударом - C++
на шахматной доске (8*8) требуется расставить 5 ферзей так, чтобы все поле находилось под ударом. Будьте добры, помогите, пожалуйста найти...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,925
Записей в блоге: 1
12.07.2013, 23:42 #2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#include <cstdio>
#include <cstring>
const int size=8;
class board{
protected:
    int rows[size];
    bool columns[size];
    bool Adiags[size*2-1];
    bool Bdiags[size*2-1];
    
 
    void reset(){
        memset(rows, -1, size*sizeof(int));
        memset(columns, false, (size)*sizeof(bool));
        memset(Adiags, false, (size*2-1)*sizeof(bool));
        memset(Bdiags, false, (size*2-1)*sizeof(bool)); 
    }
    bool putQueen(int x, int y){
        if (x<0 || x>=size || y<0 || y>=size ) return false;
        if (rows[y]!=-1) return false;
        if (columns[x]) return false;
        if (Adiags[x+y]) return false;
        if (Bdiags[size+x-y-1]) return false;
 
        rows[y]=x;
        columns[x]=true;
        Adiags[x+y]=true;
        Bdiags[size+x-y-1]=true;
        return true;
    }
    bool removeQueen(int y){
        if (y<0 || y>=size ) return false;
        if (rows[y]==-1) return false;
        int x=rows[y];
        columns[x]=false;
        Adiags[x+y]=false;
        Bdiags[size+x-y-1]=false;
        rows[y]=-1;
        return true;
    }
    bool FindFirstSolve(int i=0){
        for (int j=0; j<8; j++){
            if (putQueen(j, i)){
                if (i==7) 
                    return true;
                if (FindFirstSolve(i+1)) 
                    return true;
                removeQueen(i);
            }
        }
        return false;
    }
    void output(){
        for (int i=0; i<size; i++){
            for (int j=0; j<size; j++)
                if (j==rows[i])
                    putchar('Q');
                else
                    putchar(249);
 
            putchar('\n');
        }
    }
public:
    board(){}   
    void run(){
        int i=0;
        reset();
        if (FindFirstSolve())output();
        else printf("megafailure\n");
    }   
 
 
};
 
int main(){
    board Chessboard;
    Chessboard.run();
    getchar();
    return 0;
}
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.07.2013, 23:42
Привет! Вот еще темы с ответами:

Расставить 8 Ферзей на шахмотной доске... в борланд С - C++
Расставить 8 ферзей на шахматной доске, чтобы они не били друг друга.... Программу надо выполнить Borland C компилятор DOSA. ...

Как много шахматных слонов можно расставить, чтобы они не угрожали друг другу? - C++
Какое наибольшее число слонов можно расставить на шахматной доске так, чтобы никакие из них не угрожали друг другу. Задачу решить численным...

Расставить на шахмотной доске 5 ферезей так, чтобы каждая клетка находилась под ударом. - C++
Помагите решить задачу пожайлуста.Очень надо! Надо расставить на шахмотной доске 5 ферезей так чтобы каждая клетка находилась под ударом.

Проверить есть ли среди ферзей пара бьющих друг друга - C++
Известно, что на доске 8×8 можно расставить 8 ферзей так, чтобы они не били друг друга. Вам дана расстановка 8 ферзей на доске, определите,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru