10274 - Fans and Gems

来源:互联网 发布:中学点读软件 编辑:程序博客网 时间:2024/06/10 01:49
描述:这道题更让人头疼,想破头才知道移动的顺序必须按照字母的顺序,就是得按照D、L、R、U这个顺寻才能过,哪有这么坑人的啊,无语了……#include <cstdio>#include <cstdlib>#include <cstring>#define NX 1000003int N,M,flag;char d[]= {'D','L','R','U'};int next[NX],head[NX];char str[NX][14][22],s[1000];int count[NX][3];int move[4][2]= {{0,-1},{0,1},{1,0},{-1,0}};void search(int c,int x,int y,int rear){    if(str[rear][x][y]==c) str[rear][x][y]=' ';    else return;    search(c,x+1,y,rear);    search(c,x,y+1,rear);    search(c,x-1,y,rear);    search(c,x,y-1,rear);}int hash(int rear){    int c=0;    for(int i=0; i<N; i++)        for(int j=0; j<M; j++)            if(str[rear][i][j]>='1'&&str[rear][i][j]<='3') c=(c*5+str[rear][i][j]-'0')%NX;            else if(str[rear][i][j]==' ') c=(c*5)%NX;            else if(str[rear][i][j]=='@') c=(c*5+4)%NX;    return c;}bool insert(int c,int rear){    int x=head[c];    while(x!=-1)    {        if(memcmp(str[x],str[rear],sizeof(str[rear]))==0) return false;        x=next[x];    }    next[rear]=head[c];    head[c]=rear;    return true;}void show(int front){    if(front) show(count[front][0]);    else return;    printf("%c",d[count[front][1]]);}void del(int rear,int i){    flag=0;    for(int j=1; j<N-1; j++)        for(int k=1; k<M-1; k++)            if(str[rear][j][k]>='1'&&str[rear][j][k]<='3')            {                int c=0;                for(int l=0; l<4; l++)                {                    int x=move[l][0]+j,y=move[l][1]+k;                    if(str[rear][x][y]==str[rear][j][k]) c=flag=1;                }                if(c) search(str[rear][j][k],j,k,rear);            }}void bfs(){    flag=0;    int rear=1,front=0;    while(rear>front&&rear<NX)    {        flag=0;        for(int i=1; i<N-1&&!flag; i++)            for(int j=1; j<M-1&&!flag; j++)                if(str[front][i][j]>='1'&&str[front][i][j]<='3') flag++;        if(!flag)        {            show(front);            printf("\n");            flag=1;            return;        }        flag=0;        if(count[front][2]<18) for(int i=0; i<4; i++)            {                for(int j=0; j<N; j++)                    for(int k=0; k<M; k++)                        str[rear][j][k]=str[front][j][k];                flag=0;                if(i==1) while(1)                    {                        for(int j=1; j<N-1; j++)                            for(int k=1; k<M-1; k++)                                if(str[rear][j][k]==' ')                                {                                    int l=k+1;                                    while( l<M-1&&str[rear][j][l]==' ' )l++;                                    if((str[rear][j][l]>='1'&&str[rear][j][l]<='3')||str[rear][j][l]=='@')                                    {                                        flag=1;                                        str[rear][j][k]=str[rear][j][l];                                        str[rear][j][l]=' ';                                    }                                    else k=l;                                }                        if(flag)                        {                            del(rear,i);                            if(!flag) break;                        }                        else break;                    }                else if(i==3) while(1)                    {                        for(int k=1; k<M-1; k++)                            for(int j=1; j<N-1; j++)                                if(str[rear][j][k]==' ')                                {                                    int l=j+1;                                    while(l<N-1&&str[rear][l][k]==' ' )l++;                                    if((str[rear][l][k]>='1'&&str[rear][l][k]<='3')||str[rear][l][k]=='@')                                    {                                        flag=1;                                        str[rear][j][k]=str[rear][l][k];                                        str[rear][l][k]=' ';                                    }                                    else j=l;                                }                        if(flag)                        {                            del(rear,i);                            if(!flag) break;                        }                        else break;                    }                else if(i==2) while(1)                    {                        for(int j=1; j<N-1; j++)                            for(int k=M-2; k>0; k--)                                if(str[rear][j][k]==' ')                                {                                    int l=k-1;                                    while(l>0&&str[rear][j][l]==' ' )l--;                                    if((str[rear][j][l]>='1'&&str[rear][j][l]<='3')||str[rear][j][l]=='@')                                    {                                        flag=1;                                        str[rear][j][k]=str[rear][j][l];                                        str[rear][j][l]=' ';                                    }                                    else k=l;                                }                        if(flag)                        {                            del(rear,i);                            if(!flag) break;                        }                        else break;                    }                else while(1)                    {                        for(int k=1; k<M-1; k++)                            for(int j=N-2; j>0; j--)                                if(str[rear][j][k]==' ')                                {                                    int l=j-1;                                    while( l>0&&str[rear][l][k]==' ') l--;                                    if((str[rear][l][k]>='1'&&str[rear][l][k]<='3')||str[rear][l][k]=='@')                                    {                                        flag=1;                                        str[rear][j][k]=str[rear][l][k];                                        str[rear][l][k]=' ';                                    }                                    else j=l;                                }                        if(flag)                        {                            del(rear,i);                            if(!flag) break;                        }                        else break;                    }                int c=hash(rear);                if(insert(c,rear))                {                    count[rear][0]=front;                    count[rear][1]=i;                    count[rear][2]=count[front][2]+1;                    rear++;                }            }        front++;    }}int main(){    //freopen("a.txt","r",stdin);    int t;    scanf("%d",&t);    while(t--)    {        scanf("%d%d",&N,&M);        getchar();        for(int i=0; i<N; i++)            gets(str[0][i]);        memset(next,-1,sizeof(next));        memset(head,-1,sizeof(head));        memset(count,0,sizeof(count));        int c=hash(0);        insert(c,0);        bfs();        if(!flag) printf("-1\n");        gets(s);    }    return 0;}

原创粉丝点击