【搜索】【RQNOJ】监考老师

题目描述

【问题背景】
某日,浪子被叫去了……
【问题描述】
马上就要期中考试了,自然,在每个考场都要放监考老师(相信如果没有监考老师浪子等人会很高兴的),但是这些监考老师非常严格(谁知道是哪位“仁君”训练出来的)而且只看前后、左右,别的地方都不管——而且能透过学生看学生另一边的学生(即如果老师站在教室第X排第Y个时,他只能看到第X排学生和每排第Y个学生的考试情况——即是否在作弊)。但是学校为了节省教室,所以把很多的学生聚集在一起考试(^_^||),而且这些老师非常懒——他们不会站着,只会坐到那些空位子上去。
为了控制整个考场,所以必须多放些监考老师(这个学校师资不错),但监考老师一旦发现某人在东张西望(当然,他自己也在东张西望),就会把那家伙拖出去(好可怜啊T_T)。为了不引起混乱(监考老师把监考老师拖出去)所以每行每列最多只能放一个监考老师。
于是校长向浪子卑躬屈膝,为的只是求每个考场内最多能放多少个监考老师。

输入格式

第一行,两个数N,M分别表示考场有N排,每排M个人(0≤N,M≤200)。
接下来一个N*M的矩阵,0表示有学生坐着,1表示没有学生坐着。监考老师只能坐那些没有学生坐着的地方。

输出格式

一个数,在这个考场里最多能放多少个监考老师。

样例输入

5 5 0 0 0 1 0 0 1 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1

样例输出

5 【样例说明】 五个老师刚好坐在(1,4)、(2,2)、(3,1)、(4,3)、(5,5),能够监视整个考场,并且不会引起老师们的混乱

三维状态图像


类似N皇后的深搜,ans最大值为min(n,m)。那么当ans已经达到最大值的时候直接输出,结束程序。

如果不加这条优化,那么只能达到10分。

#include #include using namespace std; int a[201][201]; int n,m,ans; bool v[201]; void find(int x,int now) { if (x>n) return; if (now+n-x+1ans) ans=now+1; if (ans==n||ans==m) { printf("%d/n",ans); exit(0); } find(x+1,now+1); v[i]=0; } } int main() { scanf("%d%d",&n,&m); for (int i=1;i<=n;++i) for (int j=1;j<=m;++j) scanf("%d",&a[i][j]); find(1,0); printf("%d/n",ans); return 0; }

你可能感兴趣的:(RQNOJ,搜索)