有一个带有植物的字段-一个网格,其中包含N行(从1到N)和M列(从1到M);在其NM细胞中,K细胞包含植物,其余细胞包含杂草。在这个网格之外,到处都是杂草。如果两个单元格具有相同的面,则它们是相邻的。
您要在野外建立围栏,以使包含植物的每个单元格都符合以下条件:
可以从该单元移动到包含植物的每个相邻单元,而无需越过任何围栏 在没有越过栅栏的情况下不可能从这个单元移到任何包含杂草的单元
输入:
输入的第一行包含一个单个整数T,表示测试用例的数量。 T测试用例的描述如下。 每个测试用例的第一行包含三个以空格分隔的整数N,M和K。 K线跟随。每行包含两个以空格分隔的整数r和c,表示r行和c列中的单元格包含一个植物。
#include <iostream>
#include<vector>
#include<queue>
using namespace std;
int main() {
// your code goes here
int t,n,m,i,j,k,flag=0;
int r[4] = {-1,1,0,0};
int c[4] = {0,0,-1,1};
cin>>t;
while(t--) {
int ans=0;
cin>>n>>m>>k;
vector < vector<int> > vec(n, vector<int>(m,0));
/* for(int z=0; z<k; z++) {
cin>>i>>j;
vec[i-1][j-1] = 1;
} */
queue<pair<int,int>> q;
for(i=0;i<n;i++) {
for(j=0;j<m;j++) {
if(vec[i][j] == 1) {
q.push(make_pair(i,j));
flag = 1;
break;
}
}
if(flag==1)
break;
}
while(!q.empty()) {
pair<int,int> p = q.front();
int a = p.first;
int b = p.second;
int x=0;
q.pop();
for(i=0;i<4;i++) {
for(j=0;j<4;j++) {
int rr = a + r[i];
int cc = b + c[j];
if(rr<0 || cc<0 || rr>=n || cc>=m || vec[rr][cc]==0)
continue;
else {
q.push(make_pair(rr,cc));
x++;
}
}
}
ans = ans + (4-x);
}
cout<<ans<<endl;
}
return 0;
}
如果我删除上面的评论,则显示超时错误。我无法检测到以上陈述的问题。
答案 0 :(得分:1)
假设用户为(6,7)和(7,7)都设置了1。
然后将发生以下情况:
因此,如果只有一对相邻的对,您的循环将永远不会终止(对于更大的组,问题将更加严重)。
如果要避免这种情况,可以在访问该字段后设置vec[rr][cc] = 0
;或者,您可以设置vec[rr][cc] = -1
(或任何其他不同于0和1的值),然后可以区分:1,未访问0(但具有相同的值),访问0(更改为-1)。不过,您需要调整支票:
if(0 <= rr && rr < n && 0 <= cc && cc < m && vec[rr][cc] == 1)
// ...
因为在== 0
上跳过将不再起作用(不必对比较进行重新排序,但是现在它以更紧密的数学方程式0 <= rr <= n
来组装,这当然不能用C ++编写)。