蓝桥杯剪格子之DFS

问题 1432: [蓝桥杯][2013年第四届真题]剪格子

时间限制: 1Sec 内存限制: 128MB 提交: 1111 解决: 381

题目描述

历届试题  剪格子  
时间限制:1.0s     内存限制:256.0MB 
     


问题描述 
如下图所示,3  x  3  的格子中填写了一些整数。 
+--*--+--+ 
|10*  1|52| 
+--****--+ 
|20|30*  1| 
*******--+ 
|  1|  2|  3| 
+--+--+--+  
我们沿着图中的星号线剪开,得到两个部分,每个部分的数字和都是60。 
本题的要求就是请你编程判定:对给定的m  x  n  的格子中的整数,是否可以分割为两个部分,使得这两个区域的数字和相等。 
如果存在多种解答,请输出包含左上角格子的那个区域包含的格子的最小数目。  
如果无法分割,则输出  0。 

输入

程序先读入两个整数  m  n  用空格分割  (m,n< 10)。 
表示表格的宽度和高度。 
接下来是n行,每行m个正整数,用空格分开。每个整数不大于10000。 

输出

输出一个整数,表示在所有解中,包含左上角的分割区可能包含的最小的格子数目。 

样例输入

3  3 
10  1  52 
20  30  1 
1  2  3  

样例输出

扫描二维码关注公众号,回复: 5881252 查看本文章
3

提示

C语言在线学习平台微信号dotcpp

来源

历届试题

 本来我是用的BFS做的 但是不知道为什么BFS总是过不了 ,最多就只能过25% 的测试。但是理论上说不通啊 ,这道题第一反应不就是BFS嘛   这里还是放下我的WA代码吧。下面有个DFS过了

BFS WA的 WA的 WA的

#include <queue>
#include <cstdio>
#include <set>
#include <string>
#include <stack>
#include <cmath>
#include <climits>
#include <map>
#include <cstdlib>
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>
#include <stdio.h>
#include <ctype.h>
#include <bitset>
#define LL long long
#define ULL unsigned long long
#define mod 1000000007
#define INF 0x7ffffff
#define mem(a,b) memset(a,b,sizeof(a))
#define MODD(a,b) (((a%b)+b)%b)
#define PI 3.1415927
#define N 15
using namespace std;
struct node
{
    int x;
    int y;
    int step;
    int sum;
};
int sum=0;
int mp[N][N];
int vis[N][N];
int dx[4]= {1,-1,0,0};
int dy[4]= {0,0,1,-1};
int n,m;
int BFS()
{
    queue<node> Q;
//while(Q.empty()) Q.pop();
    node q,p;
    p.x=0;
    p.y=0;
    p.step=1;
    p.sum=mp[0][0];
    Q.push(p);
    vis[0][0]=1;
    int nx,ny;
//printf("%d\n",Q.front().x);
    while(!Q.empty())
    {
        p=Q.front();
        Q.pop();
        if(p.sum==sum) return p.step;
        for(int i=0; i<4; i++)
        {
            nx=p.x+dx[i];
            ny=p.y+dy[i];
            if(nx<0||nx>=n||ny<0||ny>=m||vis[nx][ny]) continue;
            else
            {
                q.sum=mp[nx][ny]+p.sum;
                q.x=nx;
                q.y=ny;
                q.step=p.step+1;
                vis[nx][ny]=1;
                Q.push(q);
            }
        }
    }
    return 0;
}
int main()
{
    scanf("%d%d",&m,&n);
    for(int i=0; i<n; i++)
    {
        for(int j=0; j<m; j++)
        {
            scanf("%d",&mp[i][j]);
            sum+=mp[i][j];
        }
    }
    sum/=2;
    printf("%d\n",BFS());
    return 0;
}

DFS AC的

#include <queue>
#include <cstdio>
#include <set>
#include <string>
#include <stack>
#include <cmath>
#include <climits>
#include <map>
#include <cstdlib>
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>
#include <stdio.h>
#include <ctype.h>
#include <bitset>
#define  LL long long
#define  ULL unsigned long long
#define mod 1000000007
#define INF 0x7ffffff
#define mem(a,b) memset(a,b,sizeof(a))
#define MODD(a,b) (((a%b)+b)%b)
#define PI 3.1415927
#define N 15
using namespace std;

struct node
{
    int x;
    int y;
    int step;
    int sum;
};
int sum=0;
int mp[N][N];
int vis[N][N];
int dx[4]={1,0,-1,0};
int dy[4]={0,1,0,-1};
int n,m;
int step=1;
int judge(int x,int y,int cot)
{
    if(x>=n||x<0||y>=m||y<0) return 0;
    if(mp[x][y]+cot>sum) return 0;
    if(vis[x][y]) return 0;
    return 1;
}
int DFS(int x,int y,int cot)
{
    int nx,ny;
    //printf("-%d-\n",cot);
    if(cot==sum) return 1;
    for(int i=0;i<4;i++){
        nx = x + dx[i];
        ny = y + dy[i];
        if(!judge(nx,ny,cot)) continue;

         vis[nx][ny] = 1;
        int res = DFS(nx,ny,cot+mp[nx][ny]);
        if(res) return res+1;
        vis[nx][ny] = 0;
    }
    return 0;//开始这个return我忘记了 一直在debug

}
int main()
{

   scanf("%d%d",&m,&n);
   mem(vis,0);
   for(int i=0;i<n;i++){
    for(int j=0;j<m;j++){
        scanf("%d",&mp[i][j]);
        sum+=mp[i][j];
    }
   }
   if(sum%2) printf("0\n");
   sum/=2;
   vis[0][0]=1;
   printf("%d\n",DFS(0,0,mp[0][0]));
   
   


    return 0;

}








猜你喜欢

转载自blog.csdn.net/qq_40620465/article/details/88757655
今日推荐