就是一个广搜加一个状态压缩
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;
}
然后这个是队列的堆,说是队列压得太多了,反正做这种题都要有一个标记数组,不然就不行。
题目链接:点击打开链接
代码:
#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;
}
相关文章推荐
- winform的Design环境是由控件的容器维护的。当控件嵌套在一个没有design环境的容器空间中时其实就是运行时状态。
- 1885Key Task(BFS+状态压缩)(胜利大逃亡续)一个意思
- 写一个方法进行各种属性的更新,而不要每个界面设置改变都改变一个属性。就是点击应用或确定按钮时调用这个更新属性的方法,遍历所有(控制对象属性的)界面控件的状态(值),进行属性修改和刷新。
- 写出一个二叉树类,也就是C++中的模板类,后面加一个二叉树接口口,即c++中的类模板,最后再来一个二叉树结点类
- 人生就是一个状态机
- 求逆的模板(求逆本质上就是在mod 的状态下除一个数)
- 1.10 状态选择器: 就是一个xml配置文件
- 基于 HMM 模型的语音识别语音识别中使用 HMM 通常是用从左向右单向、带 自环、带跨越的拓扑结构来对识别基元建模 , 一个音素 就是一个三至五状态的 HMM , 一个词就是构成词的多 个音素的 H
- listview乱跳问题-listview乱跳问题:最后状态正确,就是执行动画过程有问题,点击某一个条目中的展开全文按钮,其它的条目也都会走一下动画展开一下,随后又恢复。但最后好、状态都是正确的。
- joj 2620: Count Square 状态压缩DP N*M的0,1方格,每一个2*2的小方格有一个价值,求整个方格的最大价值
- 人生就是一个状态机
- 未来 他是一个状态,就是你想的状态
- 创建一个成功的企业的最好办法就是帮助别人赚钱
- 在IIS 6 中使用HTTP压缩(Compression)遇到的一个问题
- 一个优化后的压缩算法(下)
- 用StringStatus 函数在一个列表框中显示字符串的内部状态
- 不用编程,得到一个用户QQ在线状态
- 不用编程,得到一个用户QQ在线状态
- 历史就是一个破碗
- 一个自认为写得还可以的存储过程,就是没有注释,看起来有点乱。与ERP的BOM相关的