Jeha 300 Ответов: 1

Задача обратного хода подсчитайте квадрат


Я хочу подсчитать все квадраты и прямоугольники между координатами с помощью алгоритма обратного отслеживания, и мне нужна помощь, чтобы завершить мой код, чтобы сделать это
Стол будет похож на :
если я введу точки (1,1),(1,2),(2,1),(2,2),(3,1),(3,2),(5,2),(3,3)..
___1 2 3 4 5 6 7  
1  * * * 0 0 0 0 
2  * * * 0 * 0 0 
3  * * * 0 0 0 0

Здесь предполагается: количество квадратов=2 "первый образован точками (1,1)&(1,2)&(2,1)&(2,2), второй-точками (1,1)& (3,1)& (1,3)& (3,3) "
и прямоугольник=1 " это (1,1)& (3,1)& (1,2)& (3,2)

Что я уже пробовал:

#include <iostream>
#include <iomanip>
#include <utility>
#include <vector>
#include <iterator>

using namespace std;

const size_t size=20;

char table[size][size];

void table_clear(void){
    for(int v = 0; v<size; ++v)
        for(int h = 0; h<size; ++h)
            table[v][h]=' ';
}

void table_put(pair<int, int> p){
    int v = p.first;
    int h = p.second;
    table[v-1][h-1] = '*';//to zero origin
}

void table_disp(){
    cout << "***";
    for(int i=0; i<size;++i){
        cout << setw(3) << i + 1;
    }
    cout << "\n" << endl;
    for(int i=0;i<size;++i,cout<<endl){
        cout << setw(3) << left << i + 1;
        for(int j=0;j<size;++j){
            cout << setw(3) << right << table[i][j];
        }
        cout<<endl;
    }
}

int main(){
    vector<pair<int,int> > v;
    pair<int, int> end(99,99);
    pair<int, int> XY;

    cout << "Enter each cell in first colony use row space column Enter format, 3 4, for example.\n";
    cout << "Enter 99 99 to end entries." << endl;

while(1){
        int x,y;
        cin >> y;
        cin >> x;
        XY = make_pair(x,y);
        if(XY == end)
            break;
        v.push_back(XY);
    }
    cout<<"\n\n";

    table_clear();
    for(vector<pair<int,int> >::const_iterator iter = v.begin();iter != v.end(); ++iter ) {
        table_put(*iter);
    }
    table_disp();
}


[Обновление]
Он вычисляется как квадрат или прямоугольник в том случае, если внутри четырех углов находятся точки, в которые введены=* и !=0. " независимо от того, что внутри квадрата или прямоугольника содержится 0"
Нравится:
__1 2 3 4 5 
1 * 0 * 0 * 
2 0 0 * 0 * 
3 * 0 * * 0

Вот квадраты=1(1,1)& (3,1)& (1,3)& (3,3) и прямоугольник =2 первый(3,1)& (3,2)& (5,1)& (5,2) второй(1,1)& (3,1)& (1,3)& (3,3) 2) отсчет, начинающийся от первой ближайшей точки до (1,1) до конца таблицы методом обратного отсчета.

OriginalGriff

И что же?
Где же вопрос?
Где ты застрял?
Какая помощь вам нужна?

Patrice T

А у вас есть вопрос ?
Объясните свою проблему.
Воспользуйся Улучшить вопрос чтобы обновить ваш вопрос.

Patrice T

В чем проблема ?
Воспользуйся Улучшить вопрос чтобы обновить ваш вопрос.

1 Ответов

Рейтинг:
1

Patrice T

Что должна делать программа ?
В чем проблема ?

[Обновление]

Цитата:
Мне нужна помощь, чтобы завершить код с помощью алгоритма обратного отслеживания, чтобы подсчитать все прямоугольники и квадраты, которые определяют между введенными точками " * "
Помните, что мы не знаем, что должна делать программа.
Дайте более подробную информацию и покажите пример.
Воспользуйся Улучшить вопрос чтобы обновить ваш вопрос.

[Обновление]
В вашем примере я вижу только 2 квадрата, первый - (1,1)&(1,2)&(1,3)&(2,1)&(2,2)&(2,3)&(3,1)&(3,2)&(3,3) и второй - (2,5).
Вы должны рассказать нам правила нахождения прямоугольников и квадратов.

[Обновление]
После вашего последнего обновления,
Цитата:
отсчет начинается от первой ближайшей точки к (1,1) до конца таблицы в методе обратного отслеживания.
Насколько я понимаю вопрос, нет никакой необходимости в методе обратного отслеживания, метод не подходит к проблеме. Метод решения проблемы-вложенные циклы.
// square size is (v1, h1) to (v2, h2)
for(int v1 = 0; v1<size; ++v1) { // Upper
    for(int h1 = 0; h1<size; ++h1) { // Left
        if (table[v1][h1]== "*") {// Check if possible
            // set lower
                // set right
                    // check if other points
                        // filled conditions
                        // print solution
        }
    }
}

Поскольку это пахнет домашним заданием, я позволяю тебе закончить код.
Как программист, ваша задача-создавать алгоритмы это решает конкретные проблемы, и вы не можете полагаться на кого-то другого, чтобы вечно делать это за вас, поэтому есть время, когда вам придется научиться этому. И чем скорее, тем лучше.
Создание алгоритма-это в основном поиск математики и необходимая адаптация к вашей реальной задаче.

[Обновление]
Ваш комментарий был не читаем. Пожалуйста, обновите свой вопрос с помощью Счетного кода и объясните реальную проблему.
Воспользуйся Улучшить вопрос чтобы обновить ваш вопрос.


Для даунвотеров: комментарии не работают. опубликованные комментарии просто исчезают.


Jeha 300

Мне нужна помощь, чтобы завершить код с помощью алгоритма обратного отслеживания, чтобы подсчитать все прямоугольники и квадраты, которые определяют между введенными точками " * "

Jeha 300

1) он вычисляется как квадрат или прямоугольник в том случае, если внутри четырех углов находятся точки, в которые введены=* и !=0. " независимо от того, что внутри квадрата или прямоугольника содержится 0"
Нравится:
__1 2 3 4 5
1 * 0 * 0 *
2 0 0 * 0 *
3 * 0 * * 0
Вот квадраты=1 (1,1)& (3,1)&(1,3)& (3,3) и прямоугольник =2 первый (3,1)& (3,2)& (5,1)& (5,2) второй (1,1)& (3,1)& (1,3)& (3,3)
2) отсчет, начинающийся от первой ближайшей точки к (1,1) до конца таблицы в методе обратного отсчета.

Jeha 300

Спасибо за Вашу помощь, я попытался сделать то, что понял, код проверил, если четыре точки = ' * ' и все самые маленькие квадраты и прямоугольники подсчитаны, но проблема в том, что самый большой не засчитан:
Код таков :
аннулировать счетчик (неподписанных int с беззнаковый инт Р)
{
S=0;
R=0;

for (int v1=0; v1< size; ++v1) / / / верхний
{
for (int h1=0; h1< size; h1++) / / / Left
{
если (таблица[v1][h1]=='*')
{
если (таблица[v1][h1+1]=='*')
{
если (таблица[v1+1][h1+1]=='*')
{
если (таблица[v1+1][h1]=='*')
{
С++;

}
}
}
}

}
}
cout<< " \n количество квадратов = "< & lt; S;
// Прямоугольник
for (int v1 = 0; v1< size; ++v1) / / / верхний
{
for (int h1 = 0; h1< size; ++h1) / / / Left
{
если (таблица[v1][h1]=='*') /// проверьте, если это возможно
{
if (table[v1+2][h1]==char'*') / / / установить ниже
{
если (таблица[v1][h1+1]=='*')
{
если (таблица[v1+2][h1+1]=='*')/// установить правильно
Р++;
}
}
}
если (таблица[v1][h1]=='*')
{
если (таблица[v1][h1+1]=='*')
{
если (таблица[v1+1][h1+2]=='*')
{
если (таблица[v1+1][h1+1]=='*')
Р++;
}

}

}
}
}


cout<< " \n количество прямоугольников = "< & lt; R; / / / решение для печати
}