002
02.12.2004, 23:26 Uhr
(un)wissender
Niveauwart
|
So, hier mal eine Lösung. Vermutlich recht aufwendig, aber mir viel so ad hoc nichts besseres ein.
C++: |
#include <iostream> #include <cstddef> #include <cmath>
//Von mir selber...ca. 300 Zeilen, aber die Funktionsweise sollte klar sein. #include "TwoDArray.hpp"
const std::size_t matrixSize = 8;
std::size_t f1(std::size_t p); std::size_t f2(std::size_t p); std::size_t f3(std::size_t x, std::size_t y); void getRowAndColForPos(std::size_t p, std::size_t &row, std::size_t &col);
int main() { stdEx::TwoDArray<std::size_t> matrix(matrixSize, matrixSize); for(std::size_t i = 0; i < matrixSize * matrixSize; ++i) { std::size_t row = f1(i), col = f2(i); matrix(row, col) = f3(row, col); } for(std::size_t i = 0; i < matrixSize; ++i) { for(std::size_t j = 0; j < matrixSize; ++j) { std::cout << matrix(i,j) << " | "; } std::cout << std::endl; } }
std::size_t f1(std::size_t p) { std::size_t row, col; getRowAndColForPos(p, row, col); return row; }
std::size_t f2(std::size_t p) { std::size_t row, col; getRowAndColForPos(p, row, col); return col; }
//Sehr primitiv, hatte keine Lust mehr, vielleicht denke ich mir da noch was... std::size_t f3(std::size_t x, std::size_t y) { std::size_t row, col; for(std::size_t i = 0; i < matrixSize * matrixSize; ++i) { getRowAndColForPos(i,row, col); if(row == x && col == y) { return i; } } }
void getRowAndColForPos(std::size_t p, std::size_t &row, std::size_t &col) { std::size_t lowerBorder = 0, upperBorder = matrixSize * matrixSize, factor = matrixSize / 2, diff = upperBorder - lowerBorder;
row = col = 0; while(diff >= 4) { std::size_t granu = diff / 4;
if(p < lowerBorder + 1 * granu) { upperBorder = lowerBorder + 1 * granu; } else if(p < lowerBorder + 2 * granu) { upperBorder = lowerBorder + 2 * granu; lowerBorder = lowerBorder + 1 * granu; col += granu / factor; } else if(p < lowerBorder + 3 * granu) { upperBorder = lowerBorder + 3 * granu; lowerBorder = lowerBorder + 2 * granu; row += granu / factor; } else { lowerBorder = lowerBorder + 3 * granu; col += granu / factor; row += granu / factor; }
factor /= 2; diff = upperBorder - lowerBorder; } }
|
-- Wer früher stirbt ist länger tot. Dieser Post wurde am 02.12.2004 um 23:27 Uhr von (un)wissender editiert. |