Philosopher‘s Walk
画几遍图,你会发现有四种形态而且相互转化。
#include<iostream>
#include<cstdio>
using namespace std;
int block[4][4]={{1,0,0,3},{2,1,1,0},{3,2,2,1},{0,3,3,2}};
int rectu[4][4]={{0,1,2,3},{1,2,3,0},{2,3,0,1},{3,0,1,2}};
bool sx=true;
int init=0;
void dfs(int w,int h,int l,int n)
{
if(l==1){
printf("%d %d",w+1,h+1);
return ;
}
int sq=l*l/4;
int ch=n/sq;
if(!sx){ch=3-ch;}
int ch1=rectu[init][ch];
n%=sq;
switch(ch1){
case 0:break;
case 1:h+=l/2;break;
case 2:w+=l/2;h+=l/2;break;
case 3:w+=l/2;break;
}
int pre=init;
init=block[init][ch];
if(init!=pre){
sx=!sx;
}
dfs(w,h,l/2,n);
}
int main()
{
int l,n;
scanf("%d%d",&l,&n);
dfs(0,0,l,n-1);
}