2295 - 回家种田
时间限制 : 1 秒
内存限制 : 128 MB
Abandon毕业后准备回家种田了。他在家乡买了个N*M块的大农田并且全都种上了红薯(3<=N,M<=50),现在准备用特殊的装置给田里浇水。每一个装置只能灌溉特殊的一个区域,并且装置必须放在某一块田上。假设用坐标(x,y)来表示这N*M块田地,则整个农田的四个边角坐标便分别是(1,1)\(n,1)\(1,m)\(n,m)。每一次操作Abandon都可以选择一个放置在某个坐标(x0,y0)的田上的装置(每个装置的位置给定且固定),再选择某个田地的边角(x1,y1),然后该装置便可以灌溉所有(p,q)的田地,其中(min(x0, x1) ≤ p ≤ max(x0, x1), min(y0, y1) ≤ q ≤ max(y0, y1).)
像Abandon这种毕业只能回家种红薯的学渣当然不会算他最少需要几次才能把整个农田都浇上水,所以他跑来求助你们了。
HINT
如下图所示3*3的农田,其中(2,2)这块田(即农田正中央)有一个装置,则Abandon至少需要4步才能浇满整个农田:

题目输入
多组数据。
首先一个正整数T表示数据组数
然后对于每一组数据,
第一行给定两个整数N,M(3<=N,M<=50)
接下来一个N*M的01矩阵,(i,j)为0表示这块田上没有灌溉装置,为1则表示有。数据保证至少有一个装置,并且不会出现在农田的四个角。
题目输出
每组数据输出一个整数,表示最少需要的操作次数。
输入/输出样例
输入格式
1 3 3 0 0 0 0 1 0 0 0 0
输出格式
4
C语言解答
#include<stdio.h> int main() { int t,n,m,i,j,flag; int a[100][100]; scanf("%d",&t); while(t--) { scanf("%d%d",&m,&n); flag=0; for(i=1;i<=m;i++) for(j=1;j<=n;j++) { scanf("%d",&a[i][j]); if((i==1||j==1||i==m||j==n)&&a[i][j]==1) flag=1; } if(flag) printf("2\n"); else printf("4\n"); } return 0; }
C++解答
#include <stdio.h> #include <stdlib.h> #include <string.h> char s[1000]; int len,sum,t,x,n,m; bool flag; int main() { scanf("%d",&t); for (int ca=1;ca<=t;ca++){ flag=false; scanf("%d%d",&n,&m); for (int i=1;i<=n;i++) for (int j=1;j<=m;j++){ scanf("%d",&x); if ((i==1||j==m||i==n||j==1)&&(x==1)) flag=true; } if (flag) printf("2\n"); else printf("4\n"); } }