#include <stdio.h>
#include <stdlib.h>
int chessboard[8][8];
int indicator, x, i, j, b, checksum, testerint, temp, row, column;
int rescounter, resstarter;
void togglecolumn(int columnumber) {
//
for (j = 0; j < 8; j++) {
//
chessboard[j][columnumber] = toggleint(chessboard[j][columnumber]);
}
}
void togglerow(int rownumber) {
//
for (j = 0; j < 8; j++) {
//
chessboard[rownumber][j] = toggleint(chessboard[rownumber][j]);
}
}
void fulltoggle(int i, int j) {
//
togglerow(i);
togglecolumn(j);
chessboard[i][j] = toggleint(chessboard[i][j]);
}
int toggleint(int a) {
//
if (a == 0) {
b = 1;
}
if (a == 1) {
b = 0;
}
return b;
}
void fillchessboard() {
x = 1;
//
for (i = 0; i < 8; i++) {
x = toggleint(x);
for (j = 0; j < 8; j++) {
//
chessboard[i][j] = x;
x = toggleint(x);
}
}
}
void showchessboard() {
//
printf("------------------- \n \n");
for (i = 0; i < 8; i++) {
//
for (j = 0; j < 8; j++) {
//
if (j == 7) {
//if end of the row
printf("%d \n", chessboard[i][j]);
} else {
//
printf("%d ", chessboard[i][j]);
}
}
}
printf("\n \n");
printf("------------------- \n \n");
}
int checkboard() {
checksum = 0;
for (i = 0; i < 8; i++) {
//
for (j = 0; j < 8; j++) {
//
if (chessboard[i][j] == 1) {
//
return 1;
}
}
}
return 0;
}
void rowcolindicator(int i) {
//
if (i % 8 == 0) {
column = 7;
row = i/8 - 1;
} else {
row = i/8;
column = i % 8 - 1;
}
}
// for proper operation i should be chosen 0
int recurfuntion(int i, int stepcounter) {
if (stepcounter != 0) {
stepcounter--;
temp = i;
for (i = temp + 1; i < 65; i++) {
//do row and column for
rowcolindicator(i);
fulltoggle(row, column);
recurfuntion(i, stepcounter);
}
if (i == 65) {
i = temp++;
rowcolindicator(temp);
fulltoggle(row, column);
stepcounter++;
}
} else {
//
temp = i;
for (i = temp + 1; i < 65; i++) {
//do row and column for i code and return iteration number if board turns all right
rowcolindicator(i);
fulltoggle(row, column);
if (checkboard() == 0) {
//
showchessboard();
return 1;
} else {
//
fulltoggle(row, column);
}
}
if (i == 65) {
i = temp++;
rowcolindicator(temp);
fulltoggle(row, column);
stepcounter++;
//showchessboard();
}
}
}
int main(int argc, char *argv[]) {
fillchessboard();
showchessboard();
indicator = checkboard();
printf("indicator is %d \n", indicator);
for (rescounter = 0; rescounter < 1000; rescounter++) {
fillchessboard();
printf("iiteration number: %d \n", rescounter);
if (recurfuntion(0, rescounter) == 1) {
printf("iteration number is %d so is the answer :) \n", rescounter);
}
}
system("PAUSE");
return 0;
}
Я пытаюсь решить эту проблему: «У вас есть таблица 8x8 на экране компьютера со всеми квадратами, окрашенными в белый цвет. На каждом шаге вы выберете любой квадрат и, как результат все квадраты в том же ряду и столбце, включая выбранный квадрат, будут переключаться на их цвета (белый становится черным, а черный становится белым). Какое минимальное количество шагов требуется для получения стандартной цветной шахматной доски? "Наиболее эффективный способ поиска комбинаций в C
Для этого я пропустил шахматную доску на 64 части (8x8) и вычислил все комбинации этого 64-кластерного кластера от 1 до 64. (Я знаю, что ответ между 1 и 64).
Мой метод должен начинаться от конца (шахматная доска) до всех белых. Поэтому я заполняю доску теми (черными) и нулями (белый) и успешно завершаю шахматную доску в функции fillchessboard(). И я могу прекрасно переключаться между строкой и столбцом, на котором я выбираю начальный квадрат.
Метод проверки, если вся доска белого цвета - это контрольная панель(). Эта функция возвращает индикатор как 0, если все доски белые, 1 если нет. Я начинаю с небольших комбинаций до больших комбинаций и проверяю плату на каждом шагу. Поэтому, когда индикатор возвращается как 0 в первый раз, это будет наименьший номер итерации, чтобы сделать панель полностью белой и быть ответом на вопрос.
До сих пор мой код работает, и через 10 часов он может перейти на десятую итерацию. Однако потребуется больше времени, поэтому 11-я итерация займет около 10 часов, а 12-я итерация займет 20 часов и т. Д. ... Мой вопрос в том, есть ли какой-либо метод этих инструкций более быстрый и эффективный? Я не могу дождаться недели, чтобы решить эту проблему. Я ценю любую помощь. Благодаря!
Вы хотите что-то о сложности времени читать. Эта проблема, безусловно, не является чем-то, что нужно решить простой грубой силой. – piezol
Вместо использования грубой силы попробуйте решить проблему вручную, используя небольшие доски (например, 2x2 и 3x3 и 4x4).Скорее всего, есть шаблон, поэтому вы можете рассчитать количество шагов, необходимых без их фактического выполнения. –
Это не самый эффективный способ отступов и, как правило, форматировать C-код, это то, что вы, возможно, захотите улучшить, чтобы получить более легкую помощь. – unwind