HDU -- 5601 N*M bulbs 【思维 + 规律】

来源:互联网 发布:互联网大数据挖掘 编辑:程序博客网 时间:2024/05/18 00:33

传送门
//这道题和HDU5600很相似, 只是从一维拓展到了二维. 那么解决方法和5600也比较相似.
我们可以发现, 从起点开始去把除起点以外的为1的点全部变成0, 再回到起点, 除了起点和为1的那个点状态改变为相反状态, 其他的点都没有受影响(随便画一画就可以知道了). 最后起点的状态是由除起点以外1的个数决定的. 如果是奇数那么最后状态相反, 否则不变. 所以最后要考虑的就是从起点到终点的路线. 这条路线上除起点状态不确定外, 其他的都是0, 那么由5600的规律可以发现只要这条路上0的个数为偶数那么就是YES, 否则就是NO. 细节代码会再次说明.

AC Code

/** @Cain*/void solve(){    int n,m;    scanf("%d%d",&n,&m);    int flag = 0;    int cnt = 0;    for(int i=0;i<n;i++){        for(int j=0;j<m;j++){            int u; scanf("%d",&u);            if(i==0 && j ==0)  flag = u;            else cnt += u;        }    }    flag = cnt%2==1?1-flag:flag;  //判断起点最终的状态.    if((n+m-1-flag)%2 == 0) puts("YES");    //n+m-1表示从起点到终点经过的格子数,如果flag为0,那么表示这条路全为0.则直接判奇偶就行.    //若flag=1,那么0的个数就是n+m-2. 也是直接判奇偶就行. 所以就是这么写就可都考虑到.    else puts("NO");}
原创粉丝点击