深搜+模拟 寻宝
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深搜+模拟 寻宝相关的知识,希望对你有一定的参考价值。
#include<iostream>
#include<cmath>
using namespace std;
const int MOD=20123;
int f[10005][105],stair[105],ans,n,m;
void dfs(int k,int num)
{
int t=abs(f[k][num]),q=0;
ans+=t;
if (k==n) return;
int s=abs(f[k][num]);
s%=stair[k]; //对楼梯数取模
if (s==0) s=stair[k]; //特判s=0的情况(这里其实也可以反向搜索,即s=0时,反搜的第一个有楼梯房间就是所求)
while (q<s) //模拟过程
{
if (f[k][num]>0) q++; //有楼梯的话q++,q来计数
if (num==m-1 && q!=s) num=0; //这里需要特判!如果q=s,那么y就是所求,不需要再进行变值,所以要加q!=s的条件
else if (q!=s) num++;
}
dfs(k+1,num);
return;
}
int main()
{
ios::sync_with_stdio(false);
cin>>n>>m;
for (int i=1;i<=n;i++)
for (int j=0;j<m;j++)
{
int a,b;
cin>>a>>b; //这里我采用的是负数来判断是否有楼梯
if (a==0) f[i][j]=-b; //没楼梯就等于负数(小于0)
else
{
f[i][j]=b; //有楼梯就等于正数,且楼层楼梯数++
stair[i]++;
}
}
int start;
cin>>start;
dfs(1,start);
cout<<ans<<endl;
return 0;
}
以上是关于深搜+模拟 寻宝的主要内容,如果未能解决你的问题,请参考以下文章