52pts求调
查看原帖
52pts求调
509977
ChouQ楼主2024/11/27 15:47

双端队列,输入时预处理数组ma存的是每个点能否往四个方向走,用二进制存,判断时按位与1,感觉思路没有问题,但就是绿红交错

#include<bits/stdc++.h>
using namespace std;
const int N = 505;
int n, m, ma[N][N], vis[N][N];
int mo1[4] = {1, 1, -1, -1},
    mo2[4] = {-1, 1, 1, -1};
struct nod{
	int xn, yn;
	nod(int xn, int yn):xn(xn), yn(yn){}
};
deque<nod> qu;
int main(){
	scanf("%d%d", &n, &m);
	if((n + m) % 2){
		cout<<"NO SOLUTION";
		return 0;
	}
	memset(vis, 127, sizeof(vis));
	vis[0][0] = 0;
	char ci;
	for(int t = 0; t < n; t ++){
		for(int y = 0; y < m; y ++){
			cin >> ci;
			if(ci == '/'){
				ma[t][y+1] += (1<<2);
				ma[t+1][y] += (1<<0);
			}
			else{
				ma[t][y] += (1<<1);
				ma[t+1][y+1] += (1<<3);
			}
		}
	}
	m ++, n ++;
	qu.push_front(nod(0, 0));
	while(!qu.empty()){
		nod asd = qu.front();
		qu.pop_front();
		int wy = ma[asd.xn][asd.yn];
		for(int t = 0; t < 4; t ++){
			int wix = asd.xn + mo1[t], wiy = asd.yn + mo2[t];
			if(wix >= 0 and wix < n and wiy >= 0 and wiy < m){
				int w = (wy & 1);
				if(w){
					if(vis[asd.xn][asd.yn] < vis[wix][wiy]){
						qu.push_front(nod(wix, wiy));
						vis[wix][wiy] = vis[asd.xn][asd.yn];
					}	
				}
				else if(vis[asd.xn][asd.yn] + 1 < vis[wix][wiy]){
					qu.push_back(nod(wix, wiy));
					vis[wix][wiy] = vis[asd.xn][asd.yn] + 1;	
				}
			}
			wy >>= 1;
		}
	}
    printf("%d", vis[n-1][m-1]);
	return 0; 
}

2024/11/27 15:47
加载中...