|
|
楼主 |
发表于 2013-6-30 20:07:23
|
显示全部楼层
暂时也没想到好的算法,递归的效率实在太低了。。。
#include <string.h>
#include <stdio.h>
#define MAX_SIZE 9
#define MAX_INT 0x7FFFFFFF
#define MIN(x, y) ((x) < (y) ? (x) : (y))
int g_array[MAX_SIZE][MAX_SIZE] = {0};
int g_visit[MAX_SIZE][MAX_SIZE] = {0};
int g_row = 0;
int g_col = 0;
int g_minNum = MAX_INT;
int g_half = 0;
int g_direction[4][2] = {{-1,  0},
                         { 0,  1},
                         { 1,  0},
                         { 0, -1}};
int checkValid(int rIdx, int cIdx)
{
    if (0 > rIdx || rIdx >= g_row
     || 0 > cIdx || cIdx >= g_col)
    {
        return 0;
    }
    return 1;
}
void dfs(int rIdx, int cIdx, int sum, int num)
{
    int i;
    sum += g_array[rIdx][cIdx];
    if (sum > g_half || num + 1 > g_minNum)
    {
        return;
    }
    if (sum == g_half && 0 != g_visit[0][0])
    {
        g_minNum = MIN(g_minNum, num + 1);
        return;
    }
    for (i = 0; i < 4; i++)
    {
        int nrIdx = rIdx + g_direction[0];
        int ncIdx = cIdx + g_direction[1];
        if (checkValid(nrIdx, ncIdx)
         && 0 == g_visit[nrIdx][ncIdx]
         && sum + g_array[nrIdx][ncIdx] <= g_half)
        {
            g_visit[rIdx][cIdx] = 1;
            dfs(nrIdx, ncIdx, sum, num + 1);
            g_visit[rIdx][cIdx] = 0;
        }
    }
}
int main()
{
    int i, j;
    // 输入数字矩阵
    scanf("%d %d", &g_col, &g_row);
    for (i = 0; i < g_row; i++)
    {
        for (j = 0; j < g_col; j++)
        {
            scanf("%d", &g_array[j]);
            g_half += g_array[j];
        }
    }
    // 初步校验解是否存在
    if ((0 != (g_half & 1)) || (2 * g_array[0][0] > g_half))
    {
        printf("0\n");
        return 0;
    }
    g_half /= 2;
    for (i = 0; i < g_row; i++)
    {
        for (j = 0; j < g_col; j++)
        {
            memset(g_visit, 0, sizeof(g_visit));
            dfs(i, j, 0, 0);
        }
    }
    printf("%d\n", MAX_INT == g_minNum ? 0 : g_minNum);
    return 0;
}
|
|