用A*写的自动贪吃蛇,但运行一会后就会把自己困住然后RE,求改正
//in c++11
#include<bits/stdc++.h>
#include<windows.h>
using namespace std;
struct nde{
int x,y,d;
};
string f[50][50],f2[50][50];
int c[50][50],c2[50][50];
int dpt[50][50];
int dx[]={-1,0,0,1};
int dy[]={0,1,-1,0};
string ch[]={"^^",">>","<<","vv"};
int fx=2,fy=1;
int hx,hy;
int siz=30;
mt19937 rnd(time(NULL));
bool operator < (nde x,nde y){
return abs(x.x-fx)+abs(x.y-fy)+x.d>abs(y.x-fx)+abs(y.y-fy)+y.d;
}
void gotoXY(int a,int b){
COORD ll;
ll.X=b;
ll.Y=a;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),ll);
return ;
}
void ini(){
system("mode con cols=64 lines=32");
for(int i=0;i<=siz+1;i++){
gotoXY(i,siz*2+2);
printf("||");
gotoXY(i,0);
printf("||");
}
gotoXY(siz,0);
for(int i=1;i<=siz;i++){
gotoXY(siz+1,i*2);
printf("--");
gotoXY(0,i*2);
printf("--");
}
dpt[1][1]=1;
hx=hy=1;
return ;
}
void rd(){
for(int i=1;i<=siz;i++){
for(int j=1;j<=siz;j++){
f[i][j]=" ";
c[i][j]=0;
if(dpt[i][j]!=0){
for(int k=0;k<4;k++){
if(dpt[i+dx[k]][j+dy[k]]==dpt[i][j]+1) f[i][j]=ch[k];
}
c[i][j]=32;
}
}
}
f[hx][hy]="xx";
c[hx][hy]=64;
f[fx][fy]="bb";
c[fx][fy]=48;
for(int i=1;i<=siz;i++){
for(int j=1;j<=siz;j++){
if(f[i][j]!=f2[i][j]||c[i][j]!=c2[i][j]){
gotoXY(i,j*2);
gotoXY(i,j*2);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),c[i][j]);
printf("%s",f[i][j].c_str());
}
f2[i][j]=f[i][j];
c2[i][j]=c[i][j];
}
}
return ;
}
int bfs(int sx,int sy){
if(sx==0||sx==siz+1||sy==0||sy==siz+1) return INT_MAX;
bool vis[50][50][120]={};
priority_queue<nde> pq;
pq.push(nde{sx,sy,0});
while(!pq.empty()){
int tx=pq.top().x,ty=pq.top().y,td=pq.top().d;
pq.pop();
if(tx==0||tx==siz+1||ty==0||ty==siz+1||vis[tx][ty][td]==1||dpt[tx][ty]-td-1>0) continue;
if(tx==fx&&ty==fy) return td;
vis[tx][ty][td]=1;
for(int i=0;i<4;i++) pq.push(nde{tx+dx[i],ty+dy[i],td+1});
}
return INT_MAX;
}
void ms(){
while(1){
int tx=0,ty=0,m=INT_MAX,l=INT_MAX,f=0;
for(int i=0;i<4;i++){
tx=hx+dx[i];
ty=hy+dy[i];
if(bfs(tx,ty)<m){
m=bfs(tx,ty);
l=i;
}
}
tx=hx+dx[l];
ty=hy+dy[l];
dpt[tx][ty]=dpt[hx][hy]+1;
hx=tx;
hy=ty;
if(tx==fx&&ty==fy){
f=1;
do{
fx=rnd()%siz+1;
fy=rnd()%siz+1;
}while(dpt[fx][fy]!=0);
}
if(f==0){
for(int i=1;i<=siz;i++){
for(int j=1;j<=siz;j++) dpt[i][j]=max(0,dpt[i][j]-1);
}
}
break;
}
return ;
}
int main(){
ini();
while(1){
clock_t cl=clock();
rd();
ms();
while(clock()-cl<10);
}
return 0;
}