lunatics @ 2022-07-26 00:36:51
AC代码如下,问题发生在队列的定义,最开始我使用的是int queue[900][2]
,然后代码除了第四个点RE其余全AC。后来把数组长度开到100000,就过了。
目前随便测了几次,队列开到70000也是RE。但是理论上最多只有900个点,并且一定达不到900,队列开900就够了,为什么会出现RE的情况?求大佬赐教。
#include<stdio.h>
int queue[100000][2], matrix[40][40];
int dx[4] = { 1,0,-1,0 }, dy[4] = { 0,-1,0,1 };
void BFS(int x, int y) {
int head = 0, tail = 1;
queue[head][0] = x; queue[head][1] = y;
while (head != tail) {
for (int i = 0; i < 4; i++) {
if (matrix[queue[head][0] + dx[i]][queue[head][1] + dy[i]] == 0) {
queue[tail][0] = queue[head][0] + dx[i];
queue[tail][1] = queue[head][1] + dy[i];
tail++;
}
}
matrix[queue[head][0]][queue[head][1]] = 100;
head++;
}
}
int main(void) {
int n;
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
scanf("%d", &matrix[i][j]);
}
}
for (int i = 0; i <= n + 1; i++) {
matrix[i][0] = 100;
matrix[i][n + 1] = 100;
matrix[0][i] = 100;
matrix[n + 1][i] = 100;
}
for (int i = 1; i <= n; i++) {
if (matrix[i][1] == 0) {
BFS(i, 1);
}
if (matrix[i][n] == 0) {
BFS(i, n);
}
if (matrix[1][i] == 0) {
BFS(1, i);
}
if (matrix[n][i] == 0) {
BFS(n, i);
}
}
for (int i = 1; i <= n; i++){
for (int j = 1; j <= n; j++){
if (matrix[i][j] == 0)
matrix[i][j] = 2;
if (matrix[i][j] == 100)
matrix[i][j] = 0;
}
}
for (int i = 1; i < n; i++) {
for (int j = 1; j <= n; j++) {
printf("%d ", matrix[i][j]);
}
printf("\n");
}
for (int j = 1; j < n; j++) {
printf("%d ", matrix[n][j]);
}
printf("%d", matrix[n][n]);
}
by Powerful_25 @ 2022-07-26 08:23:03
@lunatics
可能因为你在每次元素出队时并没有真正删除元素,而是把队头位置往后移动,所以如果算上之前加入然后又删除的元素,得出的结果很可能大于900(也就是说你会RE)。
by so_find_skind @ 2022-07-26 08:41:08
@sherry0218 我冒昧的问一下:那大于70000是几个意思?
by Powerful_25 @ 2022-07-26 08:46:26
@lunatics
推荐一种方法:
头文件:
#include<queue>
定义:
queue<int> q;
PS:此处q为队列名
插入元素:
q.push(x);
PS:此处q为队列名,x为待插入元素
删除元素:
q.pop();
PS:此处q为队列名,且无返回结果
访问队头元素:
a=q.front();
PS:此处q为队列名,因返回结果为一个值(即队头元素的值),则需把这个值赋给一个变量,此处即为变量a
查询队中元素个数:
a=q.size();
PS:此处q为队列名,因返回结果为一个值(即队中元素个数),则需把这个值赋给一个变量,此处即为变量a
查询队列是否为空:
if(q.empty()==true)
PS:此处q为队列名,且返回结果为true/false(即1/0),此语句多用于判断(即if语句)
by Powerful_25 @ 2022-07-26 08:58:31
@W_YH
可能还是不够大吧,我刚刚试了一下,发现开到76000就够了
记录
by lunatics @ 2022-07-27 03:18:49
@sherry0218
谢谢大佬。我大概知道是什么原因了,应该是因为大部分点重复入队导致队长过长,再加个标记判断应该就能解决了。