二维阵列搜索算法优化

时间:2015-03-26 02:42:13

标签: c++ arrays algorithm search optimization

我被给了一个" Sand box"长度和宽度可变。我已获得指示找到一把铲子"静态尺寸,可以水平或垂直定向。我实现了以下算法,以便搜索最少的时间来找到一个有效位置(一个对应于"对象的一部分")在网格中:

found = false;
nShift = 0;
shovelSize = 4;
for(int i = 0; i < SandBoxRows; i++) {
    for(int j = 0; j < SandBoxColumns; j+=shovelSize) {
        found = probeSandBoxTwo(('A' + i), (j + 1 + nShift));
    }

    if(nShift >= shovelSize - 1 || nShift > SandBoxColumns) {
        nShift = 0;
    } else {
        nShift++;
    }
}

在这种情况下,&#34; Sand box&#34;将通过如下所述的功能进行测试。

Function description

我使用&#34; Sand box&#34;完全重新创建了这个场景。其尺寸固定(虽然容易操作),其铲子仍随机放置并定位在以下代码中:

#include <cstdlib>
#include <ctime>
#include <iostream>
using namespace std;

const int ROW = 12;
const int COL = 16;
char sandbox[ROW][COL];

bool probeSandBoxTwo(char c, int i);
void displayResults(int sCount, bool found, int x, int y);
void displaySandbox();
void displaySearchPattern();
void fillSandbox();
void placeShovel();

int main() {
    fillSandbox();
    placeShovel();
    displaySandbox();

    //define your variables here
    bool found;
    int nShift,
        sCount,
        shovelSize,
        x,
        y;


    found = false;
    nShift = 0;
    shovelSize = 4;
    sCount = 0;
    for(int i = 0; i < ROW && !found; i++) {
        for(int j = 0; j < COL && !found; j+=shovelSize) {
            found = probeSandBoxTwo(('A' + i), (j + 1 + nShift));
            x = i;
            y = j + nShift;
            sCount++;
            cout << "Search conducted at (" << i << ", " << (j + nShift) << ")" << endl;
        }

        if(nShift >= shovelSize - 1 || nShift > ROW) {
            nShift = 0;
        } else {
            nShift++;
        }
    }
    displayResults(sCount, found, x, y);
    displaySearchPattern();
}

bool probeSandBoxTwo(char c, int i) {
    if(sandbox[c-'A'][i-1] == 'X') {
        return true;
    } else {
        return false;
    }
}

void displayResults(int sCount, bool found, int x, int y) {
    cout << endl;
    cout << "Total searches: " << sCount << endl;
    cout << endl;
    if(found) {
        cout << "Shovel found at coordinates: (" << x << ", " << y << ")" << endl;
    }
}

void displaySandbox() {
    cout << "  ";
    for(int i = 0; i < COL; i++) {
        cout << (i % 10); //show index numbers [col]
    }
    cout << endl;
    for(int i = 0; i < ROW; i++) {
        cout << (i % 10) << " "; //show index numbers [row]
        for(int j = 0; j < COL; j++) {
            cout << sandbox[i][j];
        }
        cout << endl;
    }
    cout << endl;
}

void displaySearchPattern() {
    int nShift = 0;
    int shovelSize = 4;

    cout << endl << "  ";
    for(int i = 0; i < COL; i++) {
        cout << (i % 10); //show index numbers [col]
    }
    cout << endl;
    for(int i = 0; i < ROW; i++) {
        cout << (i % 10) << " "; //show index numbers [row]
        for(int j = 0; j < COL; j++) {
            if(!((j + nShift) % shovelSize)) {
                cout << 'o';
            } else {
                cout << '.';
            }
        }

        if(nShift >= shovelSize - 1 || nShift > COL) {
            nShift = 0;
        } else {
            nShift++;
        }
        cout << endl;
    }
}

void fillSandbox() {
    for(int i = 0; i < ROW; i++) {
        for(int j = 0; j < COL; j++) {
            sandbox[i][j] = '.';
        }
    }
}

void placeShovel() {
    srand(time(NULL));
    int shovelRow,
        shovelCol,
        shovelSize = 4;
    if(rand() % 2) {
        //horizontal
        shovelRow = rand() % ROW + 1;
        shovelCol = rand() % (COL - (shovelSize - 1)) + 1;
        for(int i = shovelCol - 1; i < shovelSize + (shovelCol - 1); i++) {
            sandbox[shovelRow - 1][i] = 'X';
        }
    } else {
        //vertical
        shovelRow = rand() % (ROW - (shovelSize - 1)) + 1;
        shovelCol = rand() % COL + 1;
        for(int i = shovelRow - 1; i < shovelSize + (shovelRow - 1); i++) {
            sandbox[i][shovelCol - 1] = 'X';
        }
    }
}

在此代码中,我还以图形方式显示算法搜索的模式(运行时)。

这是否真的是这种情况的最佳搜索模式,我的实现是否正确,如果是这样,为什么我可能会返回错误的结果?

给定的测试驱动程序报告以下结果:

Results

此结果的source code(及其test driver)。

1 个答案:

答案 0 :(得分:0)

    found = false;
    nShift = 0;
    shovelSize = 4;
    for(int i = 0; i < SandBoxRows; i++) {
        for(int j = 0; (j + nShift) < SandBoxColumns; j+=shovelSize) {
            found = probeSandBoxTwo(('A' + i), (j + 1 + nShift));
        }

        if(nShift >= shovelSize - 1 || nShift > SandBoxColumns) {
            nShift = 0;
        } else {
            nShift++;
        }
    }

这可以纠正for循环标题的条件部分中的错误,该错误未考虑索引转换变量nShift