Você está na página 1de 14

Lista 1 - Lógica e Computabilidade

Igor Pacheco Pereira Lucas Helio Silva Ramos


119052447 117080795

May 8, 2023

Questão 1. Encontre e prove formas fechadas para as seguintes funções definidas por recursão,
i.e., expressões que dão o valor correto da função para cada entrada, sem usar recursão. Todas as
funções têm como domı́nio os números naturais.

a.
(
0, se n = 0
A(n) =
A(n − 1) + 1, caso contrário.
Resp. A(n) = n
Prova.
Hipótese indutiva: Suponha que para algum n ∈ N seja verdade que A(n) = n.
Passo indutivo: Pela definição recursiva, A(n + 1) = A((n + 1) − 1) + 1, logo:

A(n + 1) = A((n + 1) − 1) + 1
A(n + 1) = A(n) + 1
A(n + 1) = n + 1

Caso base: Também pela definição recursiva, A(0) = 0. Logo, por indução provamos que
∀n ∈ N, A(n) = n.

* b.
1

 ,
 se n = 0
B(n) = 2 1
B(n − 1) +
 , caso contrário.
(n + 1)(n + 2)
n+1
Resp. B(n) =
n+2
Prova.
n+1
Hipótese indutiva: Suponha que para algum n ∈ N seja verdade que B(n) = .
n+2
1
Passo indutivo: Pela definição recursiva, B(n+1) = B((n+1)−1)+ ,
((n + 1) + 1)((n + 1) + 2)
logo:

1
1
B(n + 1) = B((n + 1) − 1) +
((n + 1) + 1)((n + 1) + 2)
1
= B(n) +
((n + 1) + 1)((n + 1) + 2)
1 1
= B(n − 1) + +
(n + 1)(n + 2) (n + 2)(n + 3)
1 1 1
= B(n − 2) + + +
(n)(n + 1) (n + 1)(n + 2) (n + 2)(n + 3)
..
.
1 1 1 1 1
= B(0) + + + ... + + +
(2)(3) (3)(4) (n)(n + 1) (n + 1)(n + 2) (n + 2)(n + 3)
1 1 1 1 1 1
= + + + ... + + +
2 (2)(3) (3)(4) (n)(n + 1) (n + 1)(n + 2) (n + 2)(n + 3)
n+1
X 1
B(n + 1) =
(k + 1)(k + 2)
k=0

Perceba que o somatório pode ser escrito da seguinte forma:

n+1 n+1
X 1 X 1 1
B(n + 1) = = −
(k + 1)(k + 2) k+1 k+2
k=0 k=0
1 1 1 1 1 1 1 1 1
= 1 − + − + ... + − + − + −
2 2 3 n n+1 n+1 n+2 n+2 n+3
1
= 1−
n+3
n+2
B(n + 1) =
n+3
1 0+1
Caso base: Também pela definição recursiva, B(0) = = . Logo, por indução provamos
2 0+2
n+1
que ∀n ∈ N, B(n) = .
n+2
c.
(
1, se n = 0
C(n) =
C(n − 1) + 2n + 1, caso contrário.
Resp. C(n) = (n + 1)2
Prova.
Hipótese indutiva: Suponha que para algum n ∈ N seja verdade que C(n) = (n + 1)2 .
Passo indutivo: Pela definição recursiva, C(n + 1) = C((n + 1) − 1) + 2(n + 1) + 1, logo:

Page 2
C(n + 1) = C((n + 1) − 1) + 2(n + 1) + 1
= C(n) + 2(n + 1) + 1
= (n + 1)2 + 2(n + 1) + 1
= n2 + 2n + 1 + 2n + 3
= n2 + 4n + 4
C(n + 1) = (n + 2)2

Caso base: Na definição recursiva foi dado que C(0) = 1 = (0+1)2 . Logo, por indução provamos
que ∀n ∈ N, C(n) = (n + 1)2 .

* d.

n,  
 se n = 1
D(n) = n
 D · p, caso contrário.
p
Resp. D(n) = n
Prova.
Hipótese indutiva: Suponha que para algum n ∈ N : q | n ⇐⇒ q = 1 ∨ q = n, seja verdade
que D(n) = n.
  
n·q
Passo indutivo: Pela definição recursiva, D(n · q) = D · p, logo temos dois casos:
p
1) n · q é primo. O que significa que:
  
n·q
D(n · q) = D ·p
p
  
n·q
= D ·q
q
= [D (n)] · q
D(n · q) = n · q

2) n · q é composto, então q é composto, já que n não é composto por hipótese. O que
k
significa que q pode ser decomposto em primos, q = pk11 · pk22 · . . . · pj j , assim:

Page 3
  
n·q
D(n · q) = D ·p
p
k !#
n · pk11 · pk22 · . . . · pj j
"
h  i
k
= D · p1 = D n · pk11 −1 · pk22 · . . . · pj j · p1
p1
k !#
n · pk11 −1 · pk22 · . . . · pj j
"
h  i
k
= D · p21 = D n · pk11 −2 · pk22 · . . . · pj j · p21
p1
..
= .
k !#
n · pk22 · . . . · pj j
"
h  i
k
= D · pk11 · p2 = D n · pk22 −1 · . . . · pj j · pk11 · p2
p2
..
= .
k k
= [D (n)] · pk11 · pk22 · . . . · pj j = n · pk11 · pk22 · . . . · pj j
D(n · q) = n · q

Caso base: Da definição recursiva temos, D(1) = 1. Logo, por indução provamos que ∀n > 1 ∈
N, D(n) = n.

Questão 2.
Definição 1. Considere uma linguagem de programação onde o conceito “número inteiro” faça
sentido. Listas de inteiros são definidas de acordo com as seguintes regras:

B) A lista vazia é uma lista de inteiros;


R) Dada uma lista de inteiros L e um inteiro x, o resultado de adicionar x como novo elemento
ao final de L é uma lista de inteiros.

a. Defina, por recursão, as listas de inteiros ordenadas em ordem crescente.

Resp.
B) A lista vazia é uma lista de inteiros ordenada em ordem crescente;
R) Dada uma lista de inteiros ordenada em ordem crescente L e um inteiro x, o resultado
de adicionar x ao final de L é uma lista de inteiros ordenada em ordem crescente se x é maior que
o último elemento de L.

* b. Defina uma função recursiva (em pseudocódigo, ou alguma definição puramente matemática)
que ordena listas de inteiros. Usando indução, prove que a sua função está correta.

Resp.
Prova.
A função ordenar mostrada acima ordena recursivamente ao dividı́-la em duas metades, orde-
nando ambas da mesma forma. Em em seguida, a função junta as duas metades ordenadas em uma
única lista usando a função juntar.
A função juntar assume receber duas listas já ordenadas e combina ambas recursivamente

Page 4
Algorithm 1 Ordenar lista de inteiros
1: procedure juntar(L1, L2)
2: caso base:
3: if L1 é lista vazia then return L2
4: if L2 é lista vazia then return L1
5: definindo o maior número:
6: if x ≥ y then // sendo x o último elemento de L2 e y o último de L1
7: L3 ← x.
8: else
9: L3 ← y.
return juntar(L1, L2).append(L3)
10:
11: procedure ordenar(L)
12: caso base:
13: if L é lista vazia, ou atômica then return L
14: gerando e ordenando sublistas:
15: L1 ← metade esquerda de L.
16: L2 ← metade direita de L.
17: L1 ← ordenar(L1).
18: L2 ← ordenar(L2).
19: return juntar(L1, L2)

movendo o maior dentre os últimos elementos das duas listas para o final, enquanto combina o
restante das listas da mesma forma.
Provando por indução.
Hipótese de indução: Vamos supor que a função ordenar funciona para listas lista de tamanho
igual ou menor que k.
Passo indutivo: Seja L uma lista com n > k inteiros, a função ordenar irá dividı́-la em duas
n
listas menores L1 , L2 , cada uma com tamanho . Agora temos duas possibilidades:
2
n
<= k (1)
2
n
>k (2)
2
Quando estivermos no caso (1), por hipótese, L1 e L2 serão ordenadas corretamente, pondendo
ser então combinadas pela função juntar em uma única lista ordenada.
Quando estivermos no caso (2), basta continuar aplicando a função ordenar nas sublistas L1 e
L2 até que as sublistas resultantes possuam tamanho igual ou menor que k, quando enfim se aplica
o caso (1). Basta agora provar que ∃k ∈ N tal que ordenar(L) retorna uma lista ordenada se L
possui tamanho igual ou menor a k.
Caso Base: Uma lista vazia [ ] é uma lista ordenada. Como extensão do caso base, conforme
definido no item a, uma lista atômica [x], x ∈ N é uma lista ordenada, já que [x] é a lista resultante
da inserção de x a uma lista ordenada [ ]. Em ambos os casos, a função ordenar retorna a própria

Page 5
lista recebida, sem alterações. Então nestes casos, por definição, ela retorna listas ordenadas.
Assim, podemos definir k = 1, provando que ∃k ∈ N que torna nossa hipótese de indução
verdadeira, e por consequência prova que a função ordenar consegue ordenar listas de qualquer
tamanho n > k.
Note que a função ordenar utiliza a função juntar, precisamos então provar que juntar consegue
combinar corretamente duas listas ordenadas em uma única lista também ordenada. Podemos usar
o mesmo raciocı́nio.
Hipótese de indução: Vamos supor que a função juntar funciona para listas de tamanho igual
ou menor que m, sendo capaz de combinar duas listas ordenadas em uma única lista ordenada
crescente se uma das listas iniciais tiver tamanho m.
Passo indutivo: Sejam L1 , L2 listas ordenadas com n1 > m, n2 > m inteiros respectivamente,
a função juntar irá escolher o maior dentre o último elemento de L1 e o último elemento de L2.
Após determinar o maior, a função remove este elemento de sua lista de origem, combina o restante
das duas listas com chamadas recursivas de juntar, e adiciona o elemento escolhido ao final desta
combinação.
Perceba que as listas fornecidas são ordenadas, assim o último elemento de uma lista é o maior
desta lista. Logo, o elemento escolhido é o maior dentre os elementos restantes em ambas as listas
e removê-lo não desordena as listas.
Perceba também que a cada chamada de juntar, uma das listas tem seu tamanho reduzido em
1. Com chamadas suficientes, chegaremos a uma dentre as seguintes situações:

tamanho(L1 ) ≤ m (3)

tamanho(L2 ) ≤ m (4)

Quando chegarmos a este caso, por hipótese, L1 e L2 podem ser combinadas em uma única lista
ordenada. Nos resta apenas provar que ∃m ∈ N tal que juntar(L1 , L2 ) retorna uma única lista
ordenada crescente se L1 ou L2 possuem tamanho menor ou igual a m.
Caso base: Uma lista vazia [ ] é uma lista ordenada de tamanho 0. A combinação de [ ] com
uma lista ordenada L de tamanho qualquer é a própria lista L.
A função juntar retorna corretamente L2 , quando L1 = [ ] e L1 , quando L2 = [ ]. Assim,
podemos definir m = 0, provando que ∃m ∈ N que torna nossa hipótese de indução verdadeira, e
por consequência prova que a função juntar consegue combinar duas listas de qualquer tamanho
n > m.

Questão 3.
Definição 2.
1. Uma árvore ternária é uma árvore na qual cada nó tem no máximo 3 filhos;
2. Uma árvore estritamente ternária é uma árvore ternária na qual cada nó tem 0 ou 3
filhos.
* a. Dê definições recursivas desses dois conceitos.
Resp.
1. Uma árvore é ternária se ela satisfaz uma dentre as duas condições abaixo:
ˆ A árvore é cosposta por um único nó raiz sem subárvores.

Page 6
v1

ˆ A árvore é cosposta por um nó raiz que possui até três subárvores ternárias.

v1 v1 v1

T1 T1 T2 T1 T2 T3

2. Uma árvore é estritamente ternária se ela satisfaz uma dentre as duas condições abaixo:
ˆ A árvore é cosposta por um único nó raiz sem subárvores.

v1

ˆ A árvore é cosposta por um nó raiz que possui três subárvores estritamente ternárias.

v1

T1 T2 T3

* b. Prove que para toda árvore estritamente ternária, a sua quantidade de nós deixa resto 1
quando dividida por 3.
Resp.
Hipótese indutiva: Suponha que em uma árvore estritamente ternária com n > 1 nós, a quan-
tidade de nós deixa resto 1 quando dividida por 3.
Passo indutivo: Pela definição de árvore estritamente ternária, a menor árvore estritamente
ternária maior que a árvore de tamanho n possui n + 3 nós, já que é necessário adicionar mais 3
nós em uma única folha para manter a propriedade.
Assim, considere a árvore estritamente ternária com n + 3 nós. Sabendo que, por hipótese, n é
congruente a 1 módulo 3, podemos afirmar que n + 3 também é congruente a 1 módulo 3, pois em
módulo 3 n + 3 ≡ 1 + 0. Logo, sua quantidade de nós deixa resto 1 quando dividida por 3.
Caso base: Uma árvore estritamente ternária com um único nó, que é a raiz, tem uma quanti-
dade de nós igual a 1, que deixa resto 1 quando dividida por 3.
Logo, fazendo n = 1 provamos que a quantidade de nós deixa resto 1 quando dividida por 3
para toda árvore estritamente ternária.

Questão 5.
Definição 4. O conceito de cografo é definido recursivamente pelas seguintes regras:
B) O grafo com 1 vértice e 0 arestas é um cografo;
R1) Se G e H são cografos, então sua união disjunta também é;

Page 7
R2) Se G e H são cografos, seu join (i.e., o grafo obtido da união disjunta de G e H adicionando
todas as arestas entre vértices de G e H) também é.

* a.
Definição 5. Dado n ≥ 1, denotamos por Pn o grafo caminho com n vértices (e portanto n − 1
arestas):

Dê uma definição recursiva para esses grafos.


Resp.
B) O grafo com 1 vértice e 0 arestas é um grafo caminho;
R) O grafo obtido a partir da ligação do último vértice de um grafo caminho a um novo
vértice é um grafo caminho;

* b. Prove que P3 é um cografo.


Resp.
Suponha os grafos F, G, H, que possuem 1 vértice (v1 , v2 e v3 respectivamente) e 0 arestas cada.
Por definição, os três são cografos e grafos caminho. Utilizando a definição R1 de cografo, a união
disjunta F ∪· H, que possui 2 vértices (v1 e v3 ) e 0 arestas, é um cografo.

v1 v3

·
Vamos chamar I = F ∪H. Utilizando a definição R2 de cografo, podemos afirmar que join(I, G)
é um cografo, possuindo 3 vértices (v1 , v2 e v3 ) e 2 arestas:

v1 v2 v3

Perceba que este grafo é equivalente a P3 , logo é também um grafo caminho. Assim, provamos
que P3 é um cografo.

* c. Prove por indução que todo cografo é livre de P4 , i.e., que nenhum cografo tem P4
como subgrafo induzido, i.e., que se em algum cografo temos P4 como subgrafo, então no cografo
há também alguma aresta entre vértices não consecutivos do P4 . (Uma outra forma de ver um
subgrafo induzido: é qualquer grafo que você pode obter do original removendo apenas vértices e
as arestas incidentes aos vértices removidos.)
Resp.

Page 8
Hipótese indutiva: Suponha que para todo cografo com até n vértices, não há P4 como subgrafo
induzido.
Passo indutivo: Suponha um cografo G de n + 1 vértices. Suponha também que G possui P4
como subgrafo induzido.
Vamos analisar duas possibilidades:
1) O vértice adicionado para gerar G é conectado a um vértice do P4 : Neste caso, teremos
pelo menos uma aresta entre vértices não consecutivos do P4 , pois por R2 ao adicionar o novo
vértice criando uma aresta para P4 , precisarı́amos criar arestas para todos os outros vértices.
2) O vértice adicionado para gerar G não é conectado a um vértice do P4 : Neste caso, por R2
podemos considerar o cografo G′ com os outros n vértices de G. Por hipótese G′ não possui P4 como
subgrafo induzido, o que significa que há pelo menos uma aresta entre vértices não consecutivos de
P4 .
Como G′ é um subgrafo de G, se em G′ há uma aresta entre vértices não consecutivos do P4 ,
essa mesma aresta também estará presente em G. Portanto, mesmo em G, há uma aresta entre
vértices não consecutivos do P4.
Com isto concluı́mos que, se em algum cografo temos o grafo caminho P4 como subgrafo, então
no cografo há também alguma aresta entre vértices não consecutivos do P4 o que torna impossı́vel
encontrar P4 em um subgrafo induzido.
Caso base: Perceba que em cografos com n < 3 vértices é impossı́vel haver P4 como subgrafo,
pois não há vértices suficientes. Assim, por indução, provamos que todo cografo é livre de P4 .

* d. Prove que o grafo abaixo não é um cografo.

O grafo apresentado não é um cografo pois partindo dele é possı́vel encontrar um grafo induzido
equivalente a P4 ao remover o vértice v5 e suas arestas:

v1 v5 v1

v3 v2 v3 v2

v4 v4

*Questão 7.
Definição 7. Vamos definir o conceito de um mapa de linhas recursivamente da seguinte forma:
B) Um retângulo é um mapa de linhas;

Page 9
R) Dado um mapa de linhas X, o resultado de adicionar um novo segmento de reta ligando
dois lados distintos do seu retângulo externo também é um mapa de linhas.
Veja três exemplos de mapas de linhas na figura abaixo:

Prove que todo mapa de linhas é 2-colorı́vel, i.e., que sempre é possı́vel colorir qualquer mapa
de linhas usando apenas duas cores, de forma que regiões vizinhas do mapa recebam cores difer-
entes. Considere como vizinhas apenas regiões que compartilhem algum segmento de reta, i.e., não
considere como vizinhas regiões que se encontrem em apenas um ponto (essas podem receber a
mesma cor sem problemas).
Para provar que todo mapa de linhas é 2-colorı́vel tentaremos encontrar alguma forma de rep-
resentar os mapas de linhas como grafos.
O caso base de um mapa de linhas é o retângulo, diremos que este caso base é representado
pelo grafo sem arestas com apenas um vértice.

Para os outros casos, diremos que cada região será representada por um vértice que possui
arestas apenas para vértices que representam regiões vizinhas a ela.

1 2 5
8
3 6 7

Com isto em mente, dada a definição recursiva de um mapa de linhas usaremos que, ao adicionar
um segmento de reta ligando dois lados distitos do retângulo externo, estamos dividindo pelo menos
uma região do mapa de linhas em duas regiões, que por compartilharem uma aresta (parte do
segmento de reta adicionado) são vizinhas.
Assim, o resultado no grafo de adicionar o segmento de reta ao mapa de linhas é a ”divisão”
dos vértices que representam as regiões que foram cortadas pelo segmento de reta. Ou seja, para
cada vértice que representa uma região cortada R, adicionaremos um novo vértice representando a
nova região R′ oriunda do corte e uma aresta do vértice de R para este vértice, pois ele é vizinho
de sua região de origem R.

Page 10
1 4

2 2′

3 3′ 5

Observe também que, caso uma região R cortada possua uma região vizinha S também cortada
pelo segmento, as novas regiões geradas R′ , S ′ pelo corte são também vizinhas entre si, pois possuem
parte da antiga aresta compartilhada por R e S. O que significa que devemos adicionar uma aresta
entre os vértices que representam R′ e S ′ . Faremos isso para cada par de regiões vizinhas cortadas
pelo segmento de reta adicionado.
1 4

2 2′

3 3′ 5

Por último, perceba que caso exista uma região T vizinha a R que não é cortada pelo segmento
de reta adicionado, teremos dois casos após adicionar a reta: T continua vizinho de R, ou T deixa
de ser vizinho de R e passa a ser vizinho de R′ . Se existe uma região U vizinha de T que não é
cortada pelo segmento novo e não é viznha de R o estado do vértice que representa U não muda.
1 4

2 2′

3 3′ 5

Com a representação em grafo do mapa de linhas em mente, podemos começar o processo de


colorir o mapa, diremos também que o vértice que representa uma região possui a mesma cor
da região. Para o caso base é simples, o retângulo possui uma única cor, digamos azul, e por
consequência o grafo de vértice único possui também apenas uma cor.

Para o caso recursivo, usaremos as manipulações no grafo para determinar a coloração do


mapa de linhas. Considere o mapa de linhas abaixo, que será usado para uma demonstração do
procedimento.
1 3 5

2 4 6

Page 11
Ao adicionar o segmento de reta no mapa de linhas, atualizaremos o grafo como descrito ante-
riormente, mas agora, realizaremos algumas operações com cores:

1 3 9 5

2 8 4 6

ˆ Para os novos vértices R′ , S ′ , ..., daremos cores opostas a dos vértices R, S, ... que os origi-
naram, pois são vizinhos deles;
1 3 9 5

2 8 4 6

ˆ Para vértices T que eram vizinhos dos vértices originais R, S, ... e passaram a ser vizinhos
dos novos vértices R′ , S ′ , ..., mudaremos sua cor para a cor oposta.
1 3 9 5

2 8 4 6

ˆ Para vértices T que se continuam vizinhos dos vértices originais, nada faremos.
ˆ Para vértices U que eram vizinhos dos vértices T que passaram a ser vizinhos dos novos
vértices R′ , S ′ , ..., mudaremos sua cor para a cor oposta.
1 3 9 5

2 8 4 6
Perceba que este passo a passo garante que os vértices do grafo possuirão apenas arestas para
vizinhos e garante também que vizinhos nunca tenham a mesma cor. Isto significa que, se chamar-
mos de A o grupo de vértices do grafo com a cor azul, e V o grupo de vértices no grafo com a cor
verde, nenhum vértice do grafo possui arestas para vértices que pertencem ao seu próprio grupo,
além disso, podemos dizer também que todos os vertices possuem arestas que levam a vértices do
grupo oposto.
Este detalhe é importante pois esta caracterı́stica de agrupamento de vértices em dois grupos
distintos com arestas exclusivamente entre vértices que não estão no mesmo grupo caracteriza um
grafo bipartido. Um grafo bipartido édefinido justamente como um grafo cujos vértices podem ser
divididos em dois conjuntos disjuntos A e V , por exemplo, tais que toda aresta conecta um vértice
em A a um vértice em V .

Page 12
Uma caracterı́stica de grafos bipartidos é que eles podem ser coloridos com apenas duas cores,
sem que vértices ligados por arestas tenham a mesma cor. Com isto, provamos que todo mapa
de linhas pode ser colorido com apenas duas cores, já que pode ser representado por um grafo
bipartido.

Questão 10. No jogo de xadrez, o cavalo se move em ”L”, i.e., andando 2 casas na horizon-
tal/vertical e 1 casa na vertical/horizontal (respectivamente).
* a. Prove que, para qualquer n ≥ 4, um cavalo começando na casa do canto inferior esquerdo
de um tabuleiro n × n consegue chegar a qualquer outra casa do tabuleiro em uma quantidade finita
de movimentos.
Resp.
Hipótese indutiva: Suponha que para um certo tabuleiro de tamanho n × n seja possı́vel, e
conhecida, uma forma de passar por todas as casas pelo menos uma vez partindo do canto inferior
esquerdo com o cavalo.
Passo indutivo: Imagine um tabuleiro de tamanho (n + 1) × (n + 1) construı́do adicionando
uma linha acima do tabuleiro n × n e uma coluna a direita deste mesmo tabuleiro, criando no total
2n + 1 novas casas. Devido a forma como este tabuleiro é construı́do, partindo de uma das novas
casas é possı́vel chegar sempre em pelo menos 1 casa do tabuleiro n × n com apenas 1 movimento.

Uma propriedade do movimento em ”L” do cavalo é que, se conseguimos partir da casa i para a
casa j, então podemos partir da casa j para a casa i. Isto significa que é possı́vel chegar a uma das
casas recém adicionadas se for possı́vel chegar a alguma das casas que o cavalo consegue acessar
partindo das novas casas.
Por hipótese, conhecemos uma forma de passar por cada uma das casas do tabuleiro n × n
partindo do canto esquerdo inferior. Com isto fica claro que podemos resolver o tabuleiro (n + 1) ×
(n + 1) à partir de uma solução de n × n, basta que, ao chegar em uma casa ”conectada” a uma
das novas casas, façamos dois movimentos adicionais, um de ida para a nova linha/coluna e um de
volta para o tabuleiro original. Assim, podemos dizer que há uma solução com um número finito de
passos para o tabuleiro (n + 1) × (n + 1) de tamanho tam(n × n) + 2 · (2n + 1) ou tam(n × n) + 4n + 2.
Caso base: Para um tabuleiro 4 × 4, é possı́vel para o cavalo passar por todas as casas pelo
menos uma vez partindo do canto inferior. Um dos possı́veis caminhos está representado na imagem
abaixo.

Page 13
Utilizando o tabuleiro 4 × 4 e esta solução apresentada como base, provamos que podemos criar
uma solução de passos finitos para qualquer tabuleiro n × n. Mais especı́ficamente, partindo desta
solução para o tabuleiro 4 × 4, dado um tabuleiro n × n, n = 4 + k podemos encontrar pelo menos
n−1
X
um caminho com 16 + 2k + 4 · i passos que cobre todas as casas do tabuleiro partindo da casa
i=4
inferior esquerda.

Page 14

Você também pode gostar