| 12
 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
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 
 | class Cell{
	public:
		enum class Direction {none, left, diagonal, above};
	private:
		double valeur;
		Direction direction;
 
		static Direction bestDirectionOf(double left, double diag, double above)
			if(left<diag){
				return diag<above? Direction::above : Direction::diagonal;
			} else {
				return left<above? Direction::above : Direction::left;
			}
		}
 
		static double bestOf{double left, double diag, double above
			if(left<diag){
				return diag<above? above : diagonal;
			} else {
				return left<above? above : left;
			}
		}
 
	public:
		Cell() : valeur(0), direction(Direction::none) {}
		explicit Cell(float) : valeur(v), direction(Direction::none){}
 
		Cell(double left, double diag, double above) :
			valeur( bestOf(left, diag, above) ),
			direction( bestDirectionOf(left, diag, above) )
		{}
 
		double value() const {return valeur;}
		Direction direction() const {return direction;}
};
 
inline std::ostream& operator<<(std::ostream& os, Cell c) {
	out << (c.value());
	switch(c.direction()){
		case Direction::left : return out<<"  left";
		case Direction::diagonal : return out<<"  diag";
		case Direction::above : return out<<" above";
	}
	return out;
}
 
 
using namespace boost::numeric::ublas;
void f(const QString& str1, const QString& str2) {
	out << str1<<"\r\n"<<str2<<"\r\n\r\n";
 
	matrix<Cell> m (str1.size()+1, str2.size()+1);
 
//    Initialiser le tableau
 
	for(size_t i=0; i<m.size1(); ++i) m(i,0)= Cell(-i);
	for(size_t i=1; i<m.size2(); ++i) m(0,i)= Cell(-i);
 
//    Calcul
	for(size_t i=1; i<m.size1(); ++i) {
		for(size_t j=1; j<m.size2() ;++j) {
			double diag = m(i-1, j-1).value() + ( (str1[i-1]==str2[j-1])? 1 : 0);
			double left = m(i-1, j).value() - 1;
			doubleabove = m(i, j-1).value() - 1;
 
			// Ici, je choisis le plus grand résultat et la direction.
			m(i, j) = Cell(left, diag, above);
		}
	}
 
	//affichage
	out<<"    ";
	for(size_t j=0; j<m.size2(); ++j) out << str2[j] << " ";
	out << "\r\n";
 
	for(size_t i=0; i<m.size1(); ++i) {
		out <<((i==0)?' ':str1[i-1])<<' ';
		for(size_t j=0; j<m.size2(); ++j) out << m(i,j)<<' ';
		out <<"\r\n";
	}
} |