Я пытался решить проблему в комбинациях. У меня есть матрица 6X6, я пытаюсь найти все комбинации длины 8 в матрице.
Мне нужно перемещаться от соседа к соседу из каждой строки, позиции столбца, и я написал рекурсивную программу, которая генерирует комбинацию, но проблема в том, что она также генерирует много дубликатов и, следовательно, неэффективна. Я хотел бы знать, как я могу исключить вычисление дубликатов и сэкономить время.
int a={{1,2,3,4,5,6},
{8,9,1,2,3,4},
{5,6,7,8,9,1},
{2,3,4,5,6,7},
{8,9,1,2,3,4},
{5,6,7,8,9,1},
}
void genSeq(int row,int col,int length,int combi)
{
if(length==8)
{
printf("%d\n",combi);
return;
}
combi = (combi * 10) + a[row][col];
if((row-1)>=0)
genSeq(row-1,col,length+1,combi);
if((col-1)>=0)
genSeq(row,col-1,length+1,combi);
if((row+1)<6)
genSeq(row+1,col,length+1,combi);
if((col+1)<6)
genSeq(row,col+1,length+1,combi);
if((row+1)<6&&(col+1)<6)
genSeq(row+1,col+1,length+1,combi);
if((row-1)>=0&&(col+1)<6)
genSeq(row-1,col+1,length+1,combi);
if((row+1)<6&&(row-1)>=0)
genSeq(row+1,col-1,length+1,combi);
if((row-1)>=0&&(col-1)>=0)
genSeq(row-1,col-1,length+1,combi);
}
Я также думал о написании динамической программы, основанной на рекурсии с запоминанием. Это лучший выбор?? если да, то я не понимаю, как реализовать это в рекурсии. Я действительно зашел в тупик с подходом???
Спасибо
Изменить Например, результат 12121212,12121218,12121219,12121211,12121213.
ограничения заключаются в том, что вы должны двигаться к своему соседу из любой точки, вы должны начинать с каждой позиции в матрице, то есть с каждой строки, столбца. вы можете двигаться по одному шагу за раз, то есть вправо, влево, вверх, вниз и в обе диагональные позиции. Проверьте условия if. то есть, если вы находитесь в (0,0), вы можете перейти либо к (1,0), либо к (1,1), либо (0,1), то есть к трем соседям. если вы находитесь в (2,2), вы можете перейти к восьми соседям.
и так далее...