为什么后两个点 RE 啊
查看原帖
为什么后两个点 RE 啊
390770
S0CRiA楼主2021/8/15 17:09
//P4554
#include <bits/stdc++.h>
using namespace std;

const int N = 25020;
int Head[N], Leng[N*4], Edge[N*4], Next[N*4], tot;
int n, m, sx, sy, ex, ey, st, ed;
char s[N][N]; 
int Dis[N];

inline int getpos(int x, int y){
	return x * (m + 2) + y;
}
inline void addedge(int u, int v, bool w){
	Edge[++tot] = v, Leng[tot] = (w?0:1), Next[tot] = Head[u], Head[u] = tot;
}
void bfs(int s, int e){
	memset(Dis, 0x3f, sizeof(Dis));
	deque<int> q;
	Dis[s] = 0, q.push_back(s);
	while(!q.empty()){
		int x = q.front(); q.pop_front();
		for(int i = Head[x]; i; i = Next[i]){
			int y = Edge[i], z = Leng[i];
			if(Dis[y] > Dis[x] + z){
				Dis[y] = Dis[x] + z;
				if(z) q.push_back(y); else q.push_front(y);
			}
			if(y == e) return;
		}
	}
	return;
}

int main(){
	while(scanf("%d%d", &n, &m) && n && m){
		memset(Head, 0, sizeof(Head));
		memset(Leng, 0, sizeof(Leng));
		memset(Edge, 0, sizeof(Edge));
		memset(Next, 0, sizeof(Next));
		tot = 0;
		for(int i = 1; i <= n; ++ i){
			scanf("%s", s[i] + 1);
		}
		scanf("%d%d%d%d", &sx, &sy, &ex, &ey);
		st = getpos(sx + 1, sy + 1), ed = getpos(ex + 1, ey + 1);
		for(int i = 1; i <= n; ++ i){
			for(int j = 1; j <= m; ++ j){
				addedge(getpos(i, j), getpos(i, j+1), s[i][j] == s[i][j+1]);
				addedge(getpos(i, j), getpos(i, j-1), s[i][j] == s[i][j-1]);
				addedge(getpos(i, j), getpos(i+1, j), s[i][j] == s[i+1][j]);
				addedge(getpos(i, j), getpos(i-1, j), s[i][j] == s[i-1][j]);
			}
		}
		bfs(st, ed);
		printf("%d\n", Dis[ed]);
	}
	return 0;
}

应该不是空间的问题

请不要回复“你可以试试输出中间变量或者参考题解改改”

2021/8/15 17:09
加载中...