篝火问题求助

#include <bits/stdc++.h>
#define int long long
using namespace std;
struct node {
	int x, y;
} f[1000005];
map<int, int> mp;
signed main() {
	int n, r, c;
	cin >> n >> r >> c;
	for (int i = 1; i <= n; i++) {
		char c;
		cin >> c;
		int dx = 0, dy = 0;
		if (c == 'N') {
			dx = -1;
		} else if (c == 'S') {
			dx = 1;
		} else if (c == 'W') {
			dy = -1;
		} else {
			dy = 1;
		}
		f[i].x = f[i - 1].x + dx;
		f[i].y = f[i - 1].y + dy;
		int k = f[i].x * 1000000007ll + f[i].y;
		if (i > 0 && (f[i].x != 0 || f[i].y != 0)) {
			if (!mp.count(k)) {
				mp[k] = i;
			}
		}
	}
	for (int i = 1; i <= n; i++) {
		int x = f[i].x - r;
		int y = f[i].y - c;
		int k = x * 1000000007ll + y;
		if (mp[k] == 0 || mp.count(k) || (f[k].x != 0 || f[k].y != 0)) {
			cout << 1;
		} else {
			cout << 0;
		}
	}
}

image

样例全部输出1,求助。

会不会是c变量重名了?

1 个赞

这个我试过,如果是暴力的话没问题

1 个赞

懂了,你输出那个循环不能mp全部ok了之后查,不然肯定都是1的。你要在输入的同时输出

1 个赞

就是把上面这一段移到

if (i > 0 && (f[i].x != 0 || f[i].y != 0)) {
			if (!mp.count(k)) {
				mp[k] = i;
			}
		}

下面吗?

应该是的

1 个赞

还有你的(f[k].x != 0 || f[k].y != 0)明显不对啊,k怎么回事这个数组的下标呢?

1 个赞
#include <bits/stdc++.h>
#define int long long
using namespace std;
struct node {
	int x, y;
} f[1000005];
map<int, int> mp;
signed main() {
	int n, r, c;
	cin >> n >> r >> c;
	for (int i = 1; i <= n; i++) {
		char c;
		cin >> c;
		int dx = 0, dy = 0;
		if (c == 'N') {
			dx = -1;
		} else if (c == 'S') {
			dx = 1;
		} else if (c == 'W') {
			dy = -1;
		} else {
			dy = 1;
		}
		f[i].x = f[i - 1].x + dx;
		f[i].y = f[i - 1].y + dy;
		int k = f[i].x * 1000000007ll + f[i].y;
		if (i > 0 && (f[i].x != 0 || f[i].y != 0)) {
			if (!mp.count(k)) {
				mp[k] = i;
			}
		}
		int x = f[i].x - r;
		int y = f[i].y - c;
		k = x * 1000000007ll + y;
		if (mp[k] == 0 || mp.count(k) || (f[k].x != 0 || f[k].y != 0)) {
			cout << 1;
		} else {
			cout << 0;
		}
	}
}

输出一样

我后面有点写不下去了,直接乱搞了 :smiling_face_with_halo:

f[i].x = f[i - 1].x + dx;
		f[i].y = f[i - 1].y + dy;
		int k = f[i].x * 1000000007ll + f[i].y;
				mp[k] = i;
      int x = f[i].x - r;
		int y = f[i].y - c;
		k = x * 1000000007ll + y;
		if (mp.count(k)) {
			cout << 1;
		} else {
			cout << 0;
		}
1 个赞

你的if语句有点乱,改成上面的代码应该没问题了

2 个赞
#include <bits/stdc++.h>
#define int long long
using namespace std;
struct node {
	int x, y;
} f[1000005];
map<int, int> mp;
signed main() {
	int n, r, c;
	cin >> n >> r >> c;
	for (int i = 1; i <= n; i++) {
		char c;
		cin >> c;
		int dx = 0, dy = 0;
		if (c == 'N') {
			dx = -1;
		} else if (c == 'S') {
			dx = 1;
		} else if (c == 'W') {
			dy = -1;
		} else {
			dy = 1;
		}
		f[i].x = f[i - 1].x + dx;
		f[i].y = f[i - 1].y + dy;
		int k = f[i].x * 1000000007ll + f[i].y;
		if (i > 0 && (f[i].x != 0 || f[i].y != 0)) {
			if (!mp.count(k)) {
				mp[k] = i;
			}
		}
		int x = f[i].x - r;
		int y = f[i].y - c;
		k = x * 1000000007ll + y;
		if (mp.count(k)) {
			cout << 1;
		} else {
			cout << 0;
		}
	}
}

是这样吗?全输出0了

@CZF2919

这里不需要判断

1 个赞
#include <bits/stdc++.h>
#define int long long
using namespace std;
struct node {
	int x, y;
} f[1000005];
map<int, int> mp;
signed main() {
	int n, r, c;
	cin >> n >> r >> c;
	for (int i = 1; i <= n; i++) {
		char c;
		cin >> c;
		int dx = 0, dy = 0;
		if (c == 'N') {
			dx = -1;
		} else if (c == 'S') {
			dx = 1;
		} else if (c == 'W') {
			dy = -1;
		} else {
			dy = 1;
		}
		f[i].x = f[i - 1].x + dx;
		f[i].y = f[i - 1].y + dy;
		int k = f[i].x * 1000000007ll + f[i].y;
		int x = f[i].x - r;
		int y = f[i].y - c;
		k = x * 1000000007ll + y;
		if (mp.count(k)) {
			cout << 1;
		} else {
			cout << 0;
		}
	}
}

也是0啊

因为你就算移动回(0,0)去了也没关系

1 个赞

不需要判断不是不需要mp

2 个赞
#include <bits/stdc++.h>
#define int long long
using namespace std;
struct node {
	int x, y;
} f[1000005];
map<int, int> mp;
signed main() {
	int n, r, c;
	cin >> n >> r >> c;
	for (int i = 1; i <= n; i++) {
		char c;
		cin >> c;
		int dx = 0, dy = 0;
		if (c == 'N') {
			dx = -1;
		} else if (c == 'S') {
			dx = 1;
		} else if (c == 'W') {
			dy = -1;
		} else {
			dy = 1;
		}
		f[i].x = f[i - 1].x + dx;
		f[i].y = f[i - 1].y + dy;
		int k = f[i].x * 1000000007ll + f[i].y;
		mp[k] = i;
		int x = f[i].x - r;
		int y = f[i].y - c;
		k = x * 1000000007ll + y;
		if (mp.count(k)) {
			cout << 1;
		} else {
			cout << 0;
		}
	}
}

还全是0

c重名了

1 个赞

int和char

1 个赞

哦我知道了因为换到一个循环里了所以重名就有问题了