您的位置:首页 > 其它

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

2016-10-23 19:26 288 查看
关键错误是在哪个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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐