蓝桥之 剪格子

//

    如果存在多种解答,请输出包含左上角格子的那个区域包含的格子的最小数目。       如果无法分割,则输出 0

程序输入输出格式要求: 程序先读入两个整数 m n 用空格分割 (m,n<10) 表示表格的宽度和高度 接下来是n行,每行m个正整数,用空格分开。每个整数不大于10000 程序输出:在所有解中,包含左上角的分割区可能包含的最小的格子数目。

例如: 用户输入: 3 3 10 1 52 20 30 1 1 2 3

则程序输出: 3

再例如: 用户输入: 4 3 1 1 1 1 1 30 80 2 1 1 1 100

则程序输出: 10

思路:

dfs

代码

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int a[11][11];
int vis[11][11];
int m, n;
int sum = 0, s;
int dir[4][2] = {1, 0, 0, 1, -1, 0, 0, -1};
int res = 0;
int dfs(int x, int y, int temp)
{

          if(temp == s) {
        return 1;
    }

     int r = 0;
    for(int i = 0; i < 4; i++) {
        int row = x + dir[i][0];
        int col = y + dir[i][1];
        if(row >= 0 && row < n && col >= 0 && col < m) {
            if( !vis[row][col] && temp + a[row][col] <= s ) {
                vis[row][col] = 1;
                r = dfs(row, col, temp + a[row][col]);
                if( r ){
                    return r + 1;
                }
               vis[row][col] = 0;
            }
        }
    }
    return 0;
}

int main()
{
    memset(a, 0, sizeof(a));
    memset(vis, 0, sizeof(vis));
    scanf("%d%d", &m, &n);
    for(int i = 0; i < n; i++) {
        for(int j = 0; j < m; j++) {
            scanf("%d", &a[i][j]);
            sum += a[i][j];
        }
    }
    if(sum % 2 == 1) {
        printf("0");
    }

    else {
        s = sum / 2;
        if(a[0][0] == s) {
            printf("1");
        }

     else {
            vis[0][0] = 1;
            res = dfs(0, 0, a[0][0]);
            printf("%d", res);
        }
    }
    return 0;

}

 

posted on 2015-03-13 15:31  AC_WQYYY  阅读(139)  评论(0编辑  收藏  举报

导航