题目描述
农夫john
最近在研究如果发生重大事故,如何让农场里的奶牛逃离问题。他想要确信在紧急情况下,所有的奶牛都有一个安全逃离方案。因为在紧急情况下,奶牛们都会失去观察和判断能力,所以最近john
一直在教奶牛们逃离的方法,他的方法很简单,就是任何时候都只向北方或东方逃离,北方是行坐标减1的方向,东方是列坐标加1的方向。奶牛们虽笨,不过这一点事关自己的生命,所以他们牢记在心,而且也一定会这么做。
当然也会出问题,奶牛们在逃离的方向上会横冲直撞,为了阻止奶牛之间互相冲撞造成伤害,john
要求任何一个奶牛的逃离路线不能经过其它奶牛的初始位置。一个逃离方案是安全的如果它能够满足上面的要求,反之它就是不安全的。
奶牛们所在的土地(农场)被划分成了rr行和cc列的一个矩形地图。奶牛们都待在这个矩形中的某一个位置。
请帮助john
确定给定的一个地图上是否存在一个安全的逃离方案。
比如,下面的两个图:
左边的例子表示了一个能够安全逃离的地图,因为没有任何一个奶牛的逃离路线上包括其他奶牛。右边的例子表示了一个不安全的地图,因为位于(4,1)(4,1)的奶牛不论是向东逃离还是向北逃离,它的路线上都会有别的奶牛,从这个图中拿掉任意一头奶牛,这个地图都会变成安全的。
输入格式
第11行:两个整数r,cr,c,用1个空格隔开,表示矩形的行数和列数(均 \le 50≤50)。
第22行:一个整数nn,表示奶牛的个数(\le 100≤100)。
第33到n+2n+2行:共nn行,每行有22个整数,之间用11个空格隔开,分别表示这头奶牛所在的行和列。
输出格式
如果这块土地是安全的,输出00。
如果移走任意一头奶牛这块土地还是不安全,输出-1−1。否则输出11,并且在下一行输出移走的那头奶牛的编号,如果有多个奶牛满足要求,输出输入序列中编号最小一个。
输入输出样例
输入 #1
5 5 5 1 1 2 4 3 1 2 2 2 1
输出 #1
1 1
思路
今天想练码力来着,结果tm要被气死了,本题是错题艹,具体看思路。提交的时候傻逼cin优化害得我提交6次,还不知道怎么错的,一顿魔改一直70。mmp的。
思路自己不说了,反正还是看了题解,洛谷题解摘抄一段。
模拟,首先遍历所有的奶牛,若全部安全,则输出0,结束。如果不是全部安全的,则每次将一只奶牛删除,再遍历全部,看看是否全是安全的,如果是,则输出该奶牛编号,不停止程序,也不输出1(这就是题目错误的另一个地方)直到所有情况都遍历完了,在讨论-1的情况。
#include <stdio.h>
#include <iostream>
#include <memory.h>
using namespace std;
int r,c,n,s,flag,m[101][101];
char ch[101];
struct cow
{
int x,y;
}a[101];
inline bool check(int x,int y)//检查奶牛是否安全
{
register int i,f1(1),f2(1);
for(i=1;i<x;i++)
{
if(m[i][y])//如果北面有奶牛
{
f1=0;
break;
}
}
for(i=y+1;i<=c;i++)
{
if(m[x][i])//如果东面有奶牛
{
f2=0;
break;
}
}
if(f1==0 && f2==0) return 0;//两边都有奶牛才不安全
else return 1;
}
inline bool posgoto()//用来遍历这个农场,有奶牛不安全返回0
{
register int i,j;
for(i=1;i<=r;i++)
{
for(j=1;j<=c;j++)
{
if(m[i][j])
{
if(check(i,j)==0)
return 0;
}
}
}
return 1;
}
inline bool Delete(int x,int y)//删掉一个奶牛后是否安全
{
m[x][y]=0;
return posgoto();
}
signed main()
{
//ios::sync_with_stdio(false);//这傻逼玩意害死我了,WA了6次
cin.tie(0);
cout.tie(0);
register int i,j;
cin>>r>>c>>n;
for(i=1;i<=n;i++)
{
cin>>a[i].x>>a[i].y;//输入
m[a[i].x][a[i].y]=1;//存储奶牛左边
gets(ch);
}
if(posgoto())//如果全部安全
{
cout<<0<<endl;//输出0
return 0;
}
for(i=1;i<=n;i++)
{
if(Delete(a[i].x,a[i].y))//如果去掉后安全
{
if(flag==0)
{
cout<<i<<endl;
flag=1;
}
else
{
cout<<i<<endl;
}
}
m[a[i].x][a[i].y]=1;//把这只奶牛请回来
}
if(flag==0)
{
cout<<-1<<endl;
}
return 0;
}