数据超级水我会乱说?hdu第一的代码我会乱说?
10以上就不要了我会乱说?队列只要开1000我会乱说?
→_→
#include<cstdio>
#include<cstring>
using namespace std;
bool vis[12][12][12];
int tras[4][4];
struct node
{
int a[4];
int dis;
}st,end,q[1000];
char path[1000];
int fa[1000];
char h[]="ZABCabc";
int num;
void print(int k)
{
if(!k) return;
print(fa[k]);
putchar(path[k]);
}
void bfs()
{
node f,r;
int rear=0,front=0;
st.dis=0;
q[rear++]=st;
vis[st.a[1]][st.a[2]][st.a[3]]=1;
while(front<rear)
{
f=q[front];
f.dis++;
for(int i=1;i<=3;i++)
{
r=f;
if(r.a[i])
{
r.a[i]--;
for(int j=1;j<=3;j++)
{
r.a[j]+=tras[i][j];
}
if(r.a[1]>10||r.a[2]>10||r.a[3]>10) continue;
if(!vis[r.a[1]][r.a[2]][r.a[3]])
{
fa[rear]=front;
path[rear]=h[i];
if(r.a[1]==end.a[1]&&r.a[2]==end.a[2]&&r.a[3]==end.a[3]) {printf("%d %d ",num,r.dis);print(rear);return;}
vis[r.a[1]][r.a[2]][r.a[3]]=1;
q[rear++]=r;
}
}
}
for(int i=4;i<=6;i++)
{
r=f;
int ok=1;
for(int j=1;j<=3;j++)
{
if(r.a[j]<tras[i-3][j]) ok=0;
}
if(ok)
{
for(int j=1;j<=3;j++)
{
r.a[j]-=tras[i-3][j];
}
r.a[i-3]++;
if(r.a[1]>10||r.a[2]>10||r.a[3]>10) continue;
if(!vis[r.a[1]][r.a[2]][r.a[3]])
{
path[rear]=h[i];
fa[rear]=front;
if(r.a[1]==end.a[1]&&r.a[2]==end.a[2]&&r.a[3]==end.a[3]) {printf("%d %d ",num,r.dis);print(rear);return;}
vis[r.a[1]][r.a[2]][r.a[3]]=1;
q[rear++]=r;
}
}
}
front++;
}
printf("%d NO SOLUTION",num);
}
int main()
{
int p,casq,n;
scanf("%d",&p);
while(p--)
{
scanf("%d %d",&casq,&n);
printf("%d %d\n",casq,n);
for(int i=1;i<=3;i++)
{
for(int j=1;j<=3;j++)
scanf("%d",&tras[i][j]);
}
for(int i=1;i<=n;i++)
{
scanf("%d %d %d %d %d %d %d",&num,&st.a[1],&st.a[2],&st.a[3],&end.a[1],&end.a[2],&end.a[3]);
if(st.a[1]==end.a[1]&&st.a[2]==end.a[2]&&st.a[3]==end.a[3])
{
printf("%d 0\n",num);
continue;
}
memset(vis,0,sizeof(vis));
bfs();
puts("");
}
}
return 0;
}