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

из листа клетчатой бумаги N*N клеток вырезали М клеток . на сколько кусков распадается оставшаяся часть листа? - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 5.00
danzel1
0 / 0 / 0
Регистрация: 07.09.2011
Сообщений: 8
20.10.2011, 11:49     из листа клетчатой бумаги N*N клеток вырезали М клеток . на сколько кусков распадается оставшаяся часть листа? #1
условие:из листа клетчатой бумаги N*N клеток вырезали М клеток . на сколько кусков распадается оставшаяся часть листа?

Первая строка входного файла содержит два натуральных числа N и M(N<=101 , M<= N*N <= 101)
далее идут М строк в каждой из которых координаты вырезаных клеток -номер строки х и номер столбца у.


он почемуто не работает:



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
#include<iostream>
#include<string>
using namespace std;
int chislo=0;
int main(){
    int pole[102][102];
    int n,m;
    cin >> n >> m;
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            pole[i][j]=0;
        }
    }
 
    for(int i=0;i<m;i++){
        int x,y;
        cin >> x >> y;
        pole[x+1][y+1]=666;
    }
    for(int i=n+1;i<102;i++){
        for(int j=n+1;j<102;j++){
            pole[i][j]=666;
        }
    }
    for(int i=1;i<n+1;i++){
        for(int j=1;j<n+1;j++){
            //if(pole[i][j]==0){
            //  pole[i][j]=chislo;
            //  pole[i][j+1]= pole[i][j+1]==0 ? chislo : pole[i][j+1];
            //  pole[i][j-1]= pole[i][j-1]==0 ? chislo : pole[i][j-1];
            //  pole[i+1][j]= pole[i+1][j]==0 ? chislo : pole[i+1][j];
            //  pole[i-1][j]= pole[i-1][j]==0 ? chislo : pole[i-1][j];
            //  if(pole[i][j+1]!=0 && pole[i][j-1]!=0 && pole[i+1][j]!=0 && pole[i-1][j]!=0)chislo++;
            //}
            if(pole[i][j]==chislo){
                if(pole[i][j+1])pole[i][j+1]=chislo;
                if(pole[i][j-1])pole[i][j-1]=chislo;
                if(pole[i+1][j])pole[i+1][j]=chislo;
                if(pole[i-1][j])pole[i-1][j]=chislo;
                if(pole[i][j+1]!=0 && pole[i][j-1]!=0 && pole[i+1][j]!=0 && pole[i-1][j]!=0)chislo++;
            }
        }
    }
    cout << chislo;
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.10.2011, 11:49     из листа клетчатой бумаги N*N клеток вырезали М клеток . на сколько кусков распадается оставшаяся часть листа?
Посмотрите здесь:

C++ Из листа бумаги со сторонами a и b свернуть коробочку с максимальным объемом.
Списки, Стеки,Очереди (На сколько кусков распадется оставшаяся часть листа? ) C++
C++ Сколько клеток находится под боем шахматного коня
Создать программу (Подсчитать, на сколько кусков распадется оставшаяся часть листа). C++
На сколько кусков распадется часть листа, если из него вырезать некоторые клетки? Есть алгоритм. C++
C++ Определить, сколько существует различных раскрасок полоски из N клеток
C++ Неправильно работает алгоритм поиска занятых клеток
Перекраска клеток C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4660 / 2486 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
20.10.2011, 12:32     из листа клетчатой бумаги N*N клеток вырезали М клеток . на сколько кусков распадается оставшаяся часть листа? #2
Цитата Сообщение от danzel1 Посмотреть сообщение
он почемуто не работает:
См комментарии:
Цитата Сообщение от danzel1 Посмотреть сообщение
for(int i=0;i<m;i++){
int x,y;
cin >> x >> y;
pole[x+1][y+1]=666;// наверное имелось ввиду: pole[x-1][y-1]=666; обычно в таких задачах нумерация строк и столбцов начинается с 1

тогда это:
Цитата Сообщение от danzel1 Посмотреть сообщение
for(int i=n+1;i<102;i++){
for(int j=n+1;j<102;j++){
pole[i][j]=666;
}
переделывается так:
C++
1
2
3
4
5
        for(int i=n;i<102;i++){
                for(int j=n;j<102;j++){
                        pole[i][j]=666;
                }
        }
А вот это:
Цитата Сообщение от danzel1 Посмотреть сообщение
for(int i=1;i<n+1;i++){
for(int j=1;j<n+1;j++){
//if(pole[i][j]==0){
// pole[i][j]=chislo;
// pole[i][j+1]= pole[i][j+1]==0 ? chislo : pole[i][j+1];
// pole[i][j-1]= pole[i][j-1]==0 ? chislo : pole[i][j-1];
// pole[i+1][j]= pole[i+1][j]==0 ? chislo : pole[i+1][j];
// pole[i-1][j]= pole[i-1][j]==0 ? chislo : pole[i-1][j];
// if(pole[i][j+1]!=0 && pole[i][j-1]!=0 && pole[i+1][j]!=0 && pole[i-1][j]!=0)chislo++;
//}
if(pole[i][j]==chislo){
if(pole[i][j+1])pole[i][j+1]=chislo;
if(pole[i][j-1])pole[i][j-1]=chislo;
if(pole[i+1][j])pole[i+1][j]=chislo;
if(pole[i-1][j])pole[i-1][j]=chislo;
if(pole[i][j+1]!=0 && pole[i][j-1]!=0 && pole[i+1][j]!=0 && pole[i-1][j]!=0)chislo++;
}
}
}
совсем не правильно. Внимательно посмотрите - я даже не тестировал Ваш код, но вижу, что после таких циклов chislo всегда останется равным 0. Вам здесь подойдет поиск в ширину лучше с использованием очереди.
Делаете цикл while() в котором ищете любой элемент равный 0 (если не находите, то выходите из цикла). Найденный элемент добавляете в очередь и помечаете его например тем же значением 666. Затем во внутреннем цикле добавляете в очередь все элементы рядом с начальным в очереди равные 0 (не забывая их тоже помечать). Как только очередь закончилась, то chislo++;
Yandex
Объявления
20.10.2011, 12:32     из листа клетчатой бумаги N*N клеток вырезали М клеток . на сколько кусков распадается оставшаяся часть листа?
Ответ Создать тему
Опции темы

Текущее время: 10:45. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru