求助,悬关
查看原帖
求助,悬关
547658
Shiota_Nagisa楼主2023/9/27 22:42
/*
POIN-贪吃蛇
1.input
2.bfs-找蛇
3.input2
4.move
	4.1 die
5.output 
*/
#include<bits/stdc++.h>
using namespace std;
int n,m,k,nowk;
char a[2011][2011],ord[211][211];
bool vis[2011][2011],dead[2011];
int dx[8]={0,0,1,1,1,-1,-1,-1},dy[8]={-1,1,1,0,-1,1,0,-1};
struct data{
	int x,y;
};
struct out{
	int bh,sz;
};
out als[211];
deque<data> s[211];
void dfs(int x,int y){
	vis[x][y]=1;
	data alp;
	alp.x=x;
	alp.y=y;
	s[nowk].push_back(alp);
	for(int i=0;i<8;i++){
		if(!vis[x+dx[i]][y+dy[i]]&&a[x+dx[i]][y+dy[i]]=='#'){
			dfs(x+dx[i],y+dy[i]);
			return ;
		}
	}
}
bool cmp(out aaax,out bbbx){
	if(aaax.sz!=bbbx.sz)
	return aaax.sz>bbbx.sz;
	return aaax.bh<bbbx.bh;
}
bool isdie(int x,int y){
	if(x<1||x>n||y<1||y>m||a[x][y]=='@'||a[x][y]=='#') return 1;
	return 0;
}
void gg(int wh){
	dead[wh]=1;
	deque<data> Q;
	Q=s[wh];
	while(!Q.empty()){
		data zyl=Q.front();
		a[zyl.x][zyl.y]='&';
		Q.pop_front();
	}
}
void move(int now,char dir){
	data he=s[now].front(),ta=s[now].back();
	int hx=he.x,hy=he.y;
	if(dir=='W') hx--;
	if(dir=='A') hy--;
	if(dir=='S') hx++;
	if(dir=='D') hy++;
	if(isdie(hx,hy)){
		gg(now);
		a[hx][hy]='&';
		return ;
	}
	int yx=he.x,yy=he.y,ywx=ta.x,ywy=ta.y;
	if(a[hx][hy]=='&'){
		a[hx][hy]='@';
		a[yx][yy]='#';
		data alp;
		alp.x=hx;
		alp.y=hy;
		s[now].push_front(alp);
	}
	else{
		a[hx][hy]='@';
		a[yx][yy]='#';
		a[ywx][ywy]='.';
		data alp;
		alp.x=hx;
		alp.y=hy;
		s[now].push_front(alp);
		s[now].pop_back();
	}
}
//void zyl_LOVE_gtr(){
//	cout<<nowk+1<<endl;
//	for(int i=0;i<=nowk;i++){
//		deque<data> Q;
//		Q=s[i];
//		while(!Q.empty()){
//			data zyl=Q.front();
//			cout<<zyl.x<<" "<<zyl.y<<endl;
//			Q.pop_front();
//		}
//		cout<<endl;
//	}
//}
//void zyl1314gtr(){
//	for(int i=0;i<=nowk;i++){
//		cout<<"NOW is"<<i<<endl;
//		if(dead[i]){
//			cout<<"小猪领肾虚了"<<endl;
//			continue;
//		}
//		deque<data> Q;
//		Q=s[i];
//		while(!Q.empty()){
//			data zyl=Q.front();
//			cout<<zyl.x<<" "<<zyl.y<<endl;
//			Q.pop_front();
//		}
//		cout<<endl;
//	}
//}
void zyllovegtr1314(){
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			cout<<a[i][j];
		}
		cout<<endl;
	}
}
int main(){
	cin>>n>>m>>k;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			cin>>a[i][j];
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			if(!vis[i][j]&&a[i][j]=='@'){
				dfs(i,j);
				nowk++;
			}
		}
	}
	nowk--;
//	zyl_LOVE_gtr();
	for(int i=0;i<=nowk;i++){
		string ss;
		cin>>ss;
		for(int j=0;j<k;j++){
			ord[i][j]=ss[j];
		}
	}
	for(int i=0;i<k;i++){
		for(int j=0;j<=nowk;j++){
			if(!dead[i]){
				move(j,ord[j][i]);
			}
		}
	}
//	zyl1314gtr();
//	for(int i=0;i<=nowk;i++) cout<<s[i].size()<<endl;
	for (int i=0;i<=nowk;i++){
		als[i].bh=i;
		if(dead[i]) als[i].sz=0;
		else als[i].sz=s[i].size();
	}
	sort(als,als+nowk+1,cmp);
	for(int i=0;i<=nowk;i++){
		cout<<als[i].sz<<" "<<als[i].bh+1<<endl;
	}
	int ans2=0;
//	zyllovegtr1314();
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			if(a[i][j]=='&'){
				ans2++;
			}
		}
	}
	cout<<ans2<<endl;
}
2023/9/27 22:42
加载中...