Tipos de algoritmos
Autor(es): Arissa Yoshida, Nicolas Barbosa Gomes, Luis Henrique Morelli
double euclidean(double x1, double y1, double x2, double y2) {
return (x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2);
}
int main() {
int n;
cin >> n;
vector<double> x(n), y(n);
for (int i = 0; i < n; i++)
cin >> x[i] >> y[i];
double mi = INF;
for (int i = 0; i < n; i++) {
for (int j = i + 1; j < n; j++) {
double dist = sqrt(euclidean(x[i], y[i], x[j], y[j]));
mi = min(mi, dist);
}
}
cout << dist << "\n";
return 0
}
Calcular o número de maneiras de se colocar N rainhas em um tabuleiro NxN.
Em um problema de backtracking inicia-se com uma solução vazia, nesse caso com o tabuleiro vazio.
A partir do tabuleiro vazio a solução é estendida passo a passo até que se consiga colocar todas as N rainhas.
Confira a GIF abaixo:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
vector<bool> diagonal, diagonal2, coluna, linha;
ll n;
ll cont = 0;
void colocar_rainha(ll lin, ll col) {
if (lin == n+1) {
cont++;
return;
}
if (col == n+1) return;
if (diagonal[n + (lin - col)] || diagonal2[lin+col]
|| coluna[col] || linha[lin]) {
colocar_rainha(lin, col+1);
}
else {
colocar_rainha(lin+1, 0);
}
return;
}
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
vector<pair<ll,ll>> mov = {{0, 1}, {1, 0}, {-1, 0}, {0, -1}};
vector<vector<bool>> vis;
ll linha_final = 5, coluna_final = 5;
bool flag = false;
void andar(ll lin, ll col) {
if (flag) return;
if (lin == linha_final && col == coluna_final) {
flag = true;
return;
}
if (vis[lin][col]) return;
vis[lin][col] = true;
for (int i = 0; i < mov.size(); i++) {
ll nova_linha, nova_coluna;
nova_linha = lin + mov[i].first;
nova_coluna = col + mov[i].second;
andar(nova_linha, nova_colunar);
}
return;
}