题解(循环状态)
2026-02-10 21:17:32
发布于:湖南
1阅读
0回复
0点赞
看到,
,考虑搜索后记录循环状态。
记录到达每个点的日期及旋转次数,当下次到达这个点后,就更新天数和旋转次数,旋转次数大于等于 后退出循环,结束。
细节见代码注释。
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=200+5;
const int dx[4]={0,1,0,-1};
const int dy[4]={1,0,-1,0};
//构造方向数组使dir+1表示右转,dir-1表示左转
int n,m,K,ans,k;
int vis[maxn][maxn][8][4],kk[maxn][maxn][8][4];
//vis数组表示记录的天数,kk数组表示记录的旋转次数
bool exist[maxn][maxn];
//exist数组记录的是当前位置是否有魔法师
string wizards[maxn][maxn];
//wizards数组记录法师的工作规律
int x,y,dir,day;
inline int read(){
int x=0,k=1;
char ch=getchar();
while(!isdigit(ch)&&ch!='-') ch=getchar();
if(ch=='-'){
k=-1;
ch=getchar();
}
while(isdigit(ch)){
x=x*10+(ch-'0');
ch=getchar();
}
return x*k;
}
signed main(){
n=read();K=read();
m=read();
for(int i=1;i<=m;i++){
int xx,yy;
xx=read();yy=read();
exist[xx][yy]=1;
cin>>wizards[xx][yy];
}
x=1,y=1;
day=0,dir=0;
k=0;
while(1){
if(exist[x][y])
if(wizards[x][y][day]=='R') dir=(dir+1)%4,k++;
else if(wizards[x][y][day]=='L') dir=(dir+3)%4,k++;
//左转时防止负数出现用+3代替-1
int xx=x+dx[dir],yy=y+dy[dir];
if(xx<1||xx>n||yy<1||yy>n) dir=(dir+2)%4,k++;
if(vis[x][y][day][dir]){
int lft=K-k,delta=k-kk[x][y][day][dir];
//delta表示k的变化量
k+=lft/delta*delta;
ans+=lft/delta*(ans-vis[x][y][day][dir]);
//加上剩下的完整的循环,剩下的继续跑
}
vis[x][y][day][dir]=ans++;
kk[x][y][day][dir]=k;
if(k>=K) break;
x=x+dx[dir],y=y+dy[dir];
(++day)%=7;
}
cout<<--ans<<'\n';
//上面是ans++后再结束循环的,故输出时要-1
return 0;
}
这里空空如也






有帮助,赞一个