WA 求调
查看原帖
WA 求调
1314994
Champ20091210楼主2024/10/16 14:36

WA on #5

( @roumeideclown 被禁言了,帮他发一下)

#include<bits/stdc++.h>
#pragma G++ optimize(2)
//#pragma G++ optimize(3,"Ofast","inline")
using namespace std;
typedef long long ll;
struct node {
	char a[5][5],col;
	int step;
};
map<string,int> vis;
queue<node> q;
int dx[4]={0,1,0,-1},dy[4]={1,0,-1,0};
string calc(node st) {
	string res="";
	for(int i=1;i<=4;i++)
		for(int j=1;j<=4;j++)
			res=res+st.a[i][j];
	return st.col+"$"+res;
}
bool check(node u) {
	for(int i=1;i<=4;i++) {
		if(u.a[i][1]==u.a[i][2]&&u.a[i][1]==u.a[i][3]&&u.a[i][1]==u.a[i][4]) return 1;
		if(u.a[1][i]==u.a[2][i]&&u.a[1][i]==u.a[3][i]&&u.a[1][i]==u.a[4][i]) return 1;
	}
	if(u.a[1][1]==u.a[2][2]&&u.a[1][1]==u.a[3][3]&&u.a[1][1]==u.a[4][4]) return 1;
	if(u.a[1][4]==u.a[2][3]&&u.a[1][4]==u.a[3][2]&&u.a[1][4]==u.a[4][1]) return 1;
	return 0;
}
int bfs(node st) {
	st.col='B';
	vis[calc(st)]=1;
	st.col='W';
	vis[calc(st)]=1;
	q.push(st);
	while(!q.empty()) {
		node u=q.front();
		q.pop();
		if(check(u)) return u.step;
		for(int i=1;i<=4;i++) {
			for(int j=1;j<=4;j++) {
				if(u.a[i][j]=='O') {
					for(int k=0;k<4;k++) {
						int nx=i+dx[k],ny=j+dy[k];
						if(nx<1||nx>4||ny<1||ny>4) continue;
						if(u.a[nx][ny]==u.col) {
							node v;
							for(int i1=1;i1<=4;i1++) 
								for(int j1=1;j1<=4;j1++) 
									v.a[i1][j1]=u.a[i1][j1];
							swap(v.a[nx][ny],v.a[i][j]);
							v.col=(u.col=='B'?'W':'B');
							v.step=u.step+1;
							if(!vis.count(calc(v))) {
								vis[calc(v)]=1;
								q.push(v);
							}
						}
					}
				}
			}
		}
	}
}
int main() {
	ios::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);
	node st;
	for(int i=1;i<=4;i++) 
		for(int j=1;j<=4;j++) 
			cin>>st.a[i][j];
	cout<<bfs(st);
	return 0;
}

2024/10/16 14:36
加载中...