社区讨论
U38098 PION贪吃蛇 20分现场
学术版参与者 3已保存回复 11
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 11 条
- 当前快照
- 1 份
- 快照标识符
- @mi6yvef5
- 此快照首次捕获于
- 2025/11/20 13:04 4 个月前
- 此快照最后确认于
- 2025/11/20 15:37 4 个月前
CPP
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n,m,k,cnt,foodnum;
int a[210][210],bel[210][210],input[25][110],dead[25],next[50000];
int dx[5]={0,-1,1,0,0},dy[5]={0,0,0,1,-1};
struct snake{
int len,headx,heady,lastx,lasty;
}snakes[25];
inline int exc(char c){
if(c=='.'||c=='W')return 1;
if(c=='#'||c=='S')return 2;
if(c=='@'||c=='D')return 3;
if(c=='&'||c=='A')return 4;
return 0;
}
inline char ch(int c){
if(c==1)return '.';
if(c==2)return '#';
if(c==3)return '@';
if(c==4)return '&';
return '0';
}
inline bool die(int x,int y){
if(bel[x][y])return true;
if(x<1||x>n||y<1||y>m)return true;
return false;
}
void dfs(int x,int y,int lx,int ly,int num){
bel[x][y]=num; snakes[num].len++;
next[(x-1)*m+y]=(lx-1)*m+ly;
if(a[x+1][y]==2&&(lx!=x+1||ly!=y))dfs(x+1,y,x,y,num);
else if(a[x-1][y]==2&&(lx!=x-1||ly!=y))dfs(x-1,y,x,y,num);
else if(a[x][y+1]==2&&(lx!=x||ly!=y+1))dfs(x,y+1,x,y,num);
else if(a[x][y-1]==2&&(lx!=x||ly!=y-1))dfs(x,y-1,x,y,num);
else{
snakes[num].lastx=x,snakes[num].lasty=y;
return;
}
}
void del(int x,int y,int num){
while(next[(x-1)*m+y]>0){
int lx=next[(x-1)*m+y]/m+1,ly=next[(x-1)*m+y]%m;
a[x][y]=4; bel[x][y]=0; next[(x-1)*m+y]=0;
x=lx, y=ly;
}
}
int main(){
scanf("%d%d%d",&n,&m,&k);
for(int i=1;i<=n;i++){
string s; cin>>s;
for(int j=0;j<m;j++){
a[i][j+1]=exc(s[j]);
if(a[i][j+1]==4)foodnum++;
if(a[i][j+1]==3){
cnt++;
snakes[cnt].headx=i,snakes[cnt].heady=j+1;
}
}
}
for(int i=1;i<=cnt;i++){
string s; cin>>s;
for(int j=0;j<m;j++)input[i][j+1]=exc(s[j]);
}
for(int i=1;i<=cnt;i++)
dfs(snakes[i].headx,snakes[i].heady,1,0,i);
for(int i=1;i<=k;i++){
for(int j=1;j<=cnt;j++){
if(dead[j])continue;
int ux=snakes[j].headx,uy=snakes[j].heady;
int vx=ux+dx[input[j][i]],vy=uy+dy[input[j][i]];
if(die(vx,vy)){
dead[j]=1;
del(ux,uy,j);
foodnum+=snakes[j].len;
snakes[j].len=0;
}else if(a[vx][vy]==4){
snakes[j].len++;
a[ux][uy]=2; next[(ux-1)*m+uy]=(vx-1)*m+vy;
snakes[j].headx=vx,snakes[j].heady=vy;
a[vx][vy]=3; bel[vx][vy]=j;
foodnum--;
}else{
a[ux][uy]=2; next[(ux-1)*m+uy]=(vx-1)*m+vy;
snakes[j].headx=vx,snakes[j].heady=vy;
bel[vx][vy]=j; a[vx][vy]=3;
int lx=snakes[j].lastx,ly=snakes[j].lasty;
a[lx][ly]=1; bel[lx][ly]=0;
int nx=next[(lx-1)*m+ly]/m+1,ny=next[(lx-1)*m+ly]%m;
snakes[j].lastx=nx,snakes[j].lasty=ny;
}
}
}
for(int i=1;i<=cnt;i++)printf("%d %d\n",snakes[i].len,i);
printf("%d\n",foodnum);
return 0;
}
回复
共 11 条回复,欢迎继续交流。
正在加载回复...