全网找人调代码!!!悬赏1关注!!!(没悬赏没人帮忙调)
这是题目
这是code:
//没压,我真没压,这怎么叫压行
#include<bits/stdc++.h>
using namespace std;
int n,m,k,l,cnt;//行数、列数、每条蛇的操作数、蛇的数量、剩余食物总数
char c[205][205],s[25][105];//地图、操作方向
struct o{
struct t{
int x,y;//蛇的所有部位的行数与列数
}ak[205];
int l,nb;//蛇的长度、蛇的编号
}a[25];
void dfs(int x,int y,int fax,int fay){
if(c[x+1][y]=='#'&&x+1!=fax)a[l].ak[++a[l].l]={x+1,y},dfs(x+1,y,x,y);//记录此时的坐标,往下继续搜
else if(c[x][y+1]=='#'&&y+1!=fay)a[l].ak[++a[l].l]={x,y+1},dfs(x,y+1,x,y);//同上,往右继续搜
else if(c[x-1][y]=='#'&&x-1!=fax)a[l].ak[++a[l].l]={x-1,y},dfs(x-1,y,x,y);//同上,往上继续搜
else if(c[x][y-1]=='#'&&y-1!=fay)a[l].ak[++a[l].l]={x,y-1},dfs(x,y-1,x,y);//同上,往左继续搜
}
void dfs4(int snb,int x){
c[a[snb].ak[a[snb].l].x][a[snb].ak[a[snb].l].y]='.',c[a[snb].ak[1].x][a[snb].ak[1].y]='#';//将蛇尾改为路,蛇头改为蛇身
for(int i=a[snb].l;i>=2;i--)a[snb].ak[i]=a[snb].ak[i-1];//此时蛇的这个部位移动到了它前一个部位的位置
if(x==1)a[snb].ak[1].x--;//如果是1向上走
if(x==2)a[snb].ak[1].x++;//如果是2向下走
if(x==3)a[snb].ak[1].y--;//如果是3向左走
if(x==4)a[snb].ak[1].y++;//如果是4向右走
c[a[snb].ak[1].x][a[snb].ak[1].y]='@';//更新蛇头
}
void dfs5(int snb,int x,int y){
for(int i=1;i<=a[snb].l;i++)c[a[snb].ak[i].x][a[snb].ak[i].y]='&';//将这条蛇改为食物
a[snb].l=0;//将这条蛇的长度清零
}
void dfs2(int snb,int x,int y,char zt){
if(zt=='W'&&c[x-1][y]!='#'&&c[x-1][y]!='@'&&x-1>0){
if(c[x-1][y]=='&'){//如果下一步是食物,将食物设为蛇头,原先的蛇头设为蛇身,蛇的长度加1
c[x][y]='#',c[x-1][y]='@',a[snb].l++;
for(int i=a[snb].l;i>=2;i--)a[snb].ak[i]=a[snb].ak[i-1];
a[snb].ak[1]={x-1,y};
}else dfs4(snb,1);//否则蛇直接向下一步进一
}else if(zt=='S'&&c[x+1][y]!='#'&&c[x+1][y]!='@'&&x+1<=n){
if(c[x+1][y]=='&'){//思路同上
c[x][y]='#',c[x+1][y]='@',a[snb].l++;
for(int i=a[snb].l;i>=2;i--)a[snb].ak[i]=a[snb].ak[i-1];
a[snb].ak[1]={x+1,y};
}else dfs4(snb,2);//思路同上
}else if(zt=='A'&&c[x][y-1]!='#'&&c[x][y-1]!='@'&&y-1>0){
if(c[x][y-1]=='&'){//思路同上
c[x][y]='#',c[x][y-1]='@',a[snb].l++;
for(int i=a[snb].l;i>=2;i--)a[snb].ak[i]=a[snb].ak[i-1];
a[snb].ak[1]={x,y-1};
}else dfs4(snb,3);//思路同上
}else if(zt=='D'&&c[x][y+1]!='#'&&c[x][y+1]!='@'&&y+1<=m){
if(c[x][y+1]=='&'){//思路同上
c[x][y]='#',c[x][y+1]='@',a[snb].l++;
for(int i=a[snb].l;i>=2;i--)a[snb].ak[i]=a[snb].ak[i-1];
a[snb].ak[1]={x,y+1};
}else dfs4(snb,4);//思路同上
}else dfs5(snb,x,y);//否则就是这条蛇died了,将这条蛇的每一个身体部位包括蛇头设为食物
}
bool f(o x,o y){
if(x.l!=y.l)return x.l>y.l;//先按长度排序
return x.nb<y.nb;//长度相同按编号排序
}
int main(){
cin>>n>>m>>k;//输入地图行数列数还有每条蛇的操作数
for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)cin>>c[i][j];//输入地图
for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)if(c[i][j]=='@')a[++l].ak[++a[l].l]={i,j},a[l].nb=l,dfs(i,j,0,0);//如果搜索到蛇头,那么蛇的数量加1,记录蛇头所在的位置以及它的编号,搜索蛇的身体
for(int i=1;i<=l;i++)for(int j=1;j<=k;j++)cin>>s[i][j];//输入每条蛇的操作
for(int i=1;i<=k;i++)for(int j=1;j<=l;j++)if(a[j].l)dfs2(j,a[j].ak[1].x,a[j].ak[1].y,s[j][i]);//对第j条蛇从蛇头开始每一次从编号大到小对蛇移动方向进行操作s[i][j]
sort(a+1,a+1+l,f);//给蛇的长度和编号排序
for(int i=1;i<=l;i++)cout<<a[i].l<<' '<<a[i].nb<<endl;//输出每条蛇的长度和编号
for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)if(c[i][j]=='&')cnt++;//如果找到食物,cnt加1
cout<<cnt;//输出剩余食物总数
return 0;
}
这是记录:
求助!!!
蛮好,思路和测试点完全一样,我也就服了
hh