就是一个广搜加一个状态压缩

来源:互联网 发布:js 提取 网页文本 编辑:程序博客网 时间:2024/06/06 12:48

关键错误是在哪个y1,据说y1是在cmath里面的一个函数,不可当做变量使用,真是涨知识。

然后这个是队列的堆,说是队列压得太多了,反正做这种题都要有一个标记数组,不然就不行。

题目链接:点击打开链接

代码:

#include<stdio.h>#include<algorithm>#include<string.h>#include<queue>#include<iostream>#include<ctype.h>using namespace std;//#pragma comment(linker, “/STACK:1024000000,1024000000”)int xx[5]= {0,0,1,-1};int yy[5]= {1,-1,0,0};char q[30][30];int qq2[30][30][2000];int yaoshi[15]= {1,2,4,8,16,32,64,128,256,512};int x1,yy1,t,n,m;struct qq{    int a,b;    int step;    int yaoshi[30];    int hashzhi;} q1,q2;queue<qq>w;void dfs(int x,int y){    memset(qq2,0,sizeof(qq2));    for(int k=0; k<30; k++)    {        q1.yaoshi[k]=0;        q2.yaoshi[k]=0;    }    while(!w.empty())    {        w.pop();    }    q1.a=x;    q1.b=y;    q1.step=0;    q1.hashzhi=0;    w.push(q1);    qq2[q1.a][q1.b][q1.hashzhi]=1;    while(!w.empty())    {        qq q3=w.front();        w.pop();        for(int i=0; i<4; i++)        {            q2.a=q3.a+xx[i];            q2.b=q3.b+yy[i];            q2.step=q3.step+1;            q2.hashzhi=q3.hashzhi;            if(q2.step>=t)            {                printf("-1\n");                return ;            }            if((q2.a==x1)&&(q2.b==yy1))            {                if(q2.step<t)                {                    printf("%d\n",q2.step);                }                else                    printf("-1\n");                return ;            }            if(qq2[q2.a][q2.b][q2.hashzhi])                continue;            if(q2.a<0||q2.b<0||q2.a>=n||q2.b>=m||q[q2.a][q2.b]=='*')                continue;            for(int j=0; j<26; j++)                q2.yaoshi[j]=q3.yaoshi[j];            if(islower(q[q2.a][q2.b]))            {                if(q2.yaoshi[q[q2.a][q2.b]-'a']==0)                {                    q2.yaoshi[q[q2.a][q2.b]-'a']=1;                    if(!qq2[q2.a][q2.b][q2.hashzhi+yaoshi[q[q2.a][q2.b]-'a']])                        q2.hashzhi+=yaoshi[q[q2.a][q2.b]-'a'];                }            }            if(isupper(q[q2.a][q2.b]))            {                if(! q2.yaoshi[q[q2.a][q2.b]-'A'])                    continue;            }            qq2[q2.a][q2.b][q2.hashzhi]=1;            w.push(q2);        }    }    printf("-1\n");    return ;}int main(){    while(~scanf("%d%d%d",&n,&m,&t))    {////        for (int i=0; i<n; i++)////        {////            for(int j=0; j<m; j++)////            {////                cin>>q[i][j];////////            }////        }        for(int i=0; i<n; i++)        {            scanf("%s",q[i]);        }        int x,y;        for(int i=0; i<n; i++)            for(int j=0; j<m; j++)            {                if(q[i][j]=='@')                {                    x=i;                    y=j;                }                else if(q[i][j]=='^')                {                    x1=i;                    yy1=j;                }            }//        if(x==x1&&y==y1)//            printf("0\n");//        else        dfs(x,y);    }    return 0;}


0 0
原创粉丝点击