DFS 蓝桥杯 剪格子

来源:互联网 发布:手机网络电视直播 编辑:程序博客网 时间:2024/05/05 01:08
问题描述

如下图所示,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。

输出格式
输出一个整数,表示在所有解中,包含左上角的分割区可能包含的最小的格子数目。
样例输入1
3 3
10 1 52
20 30 1
1 2 3
样例输出1
3
样例输入2
4 3
1 1 1 1
1 30 80 2
1 1 1 100
样例输出2
10

[cpp] view plaincopy在CODE上查看代码片派生到我的代码片
  1. #include<iostream>  
  2. #include<cstring>  
  3. #include<algorithm>  
  4. using namespace std;  
  5.   
  6. int m, n;//表格的宽度和高度  
  7. int data[11][11];//格子中元素  
  8. int visited[11][11];  
  9. int sum;//表格中所有元素的和  
  10. int s;  
  11. int res;  
  12. //int temp;  
  13. int t;  
  14. int moving[4][2] = { { 1, 0 }, { 0, 1 }, { -1, 0 }, { 0, -1 } };//移动的四个方向  
  15. //int moving[4][2] = { { 0, 1 }, { 1, 0 }, { 0, -1 }, { -1, 0 } };  
  16.   
  17. int dfs(int x, int y,int temp)  
  18. {  
  19.     if (temp == s)  
  20.         return 1;  
  21.     int r=0;  
  22.     for (int k = 0; k < 4; k++)  
  23.     {  
  24.         int i = x + moving[k][0];  
  25.         int j = y + moving[k][1];  
  26.   
  27.         //边界检查  
  28.         if (i >= 0 && i < n&&j >= 0 && j < m)  
  29.         {  
  30.             if (visited[i][j] == 0 && temp + data[i][j] <= s)  
  31.             {  
  32.                 visited[i][j] = 1;  
  33.                 r = dfs(i, j,temp+data[i][j]);  
  34.                 if (r)  
  35.                     return r + 1;  
  36.                 visited[i][j] = 0;  
  37.             }  
  38.         }  
  39.     }  
  40.     return 0;  
  41. }  
  42.   
  43. int main()  
  44. {  
  45.     while (cin >> m >> n)  
  46.     {  
  47.         memset(data, 0,sizeof(data));  
  48.         memset(visited, 0,sizeof(visited));  
  49.         sum = 0;  
  50.         //input  
  51.         for (int i = 0; i < n; i++)  
  52.         {  
  53.             for (int j = 0; j < m; j++)  
  54.             {  
  55.                 cin >> data[i][j];  
  56.                 sum += data[i][j];  
  57.             }  
  58.         }  
  59.   
  60.         if (sum % 2 == 0)  
  61.         {  
  62.             s = sum / 2;  
  63.             //temp = data[0][0];  
  64.             if (data[0][0] == s)  
  65.                 res = 1;  
  66.             else  
  67.             {  
  68.                 visited[0][0] = 1;  
  69.                 res=dfs(0, 0,data[0][0]);  
  70.             }  
  71.         }  
  72.         else//如果和为奇数,则不可能存在剪格子方法  
  73.         {  
  74.             res = 0;  
  75.         }  
  76.         cout << res << endl;  
  77.       
  78.     }  
  79.   
  80.     return 0;  
  81. }  

简单的DFS,不过很容易出错......写的时候一定要小心
0 0