专栏文章
题解:P13348 「ZYZ 2025」未选择的路
P13348题解参与者 4已保存评论 4
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 4 条
- 当前快照
- 1 份
- 快照标识符
- @miott9i0
- 此快照首次捕获于
- 2025/12/03 01:02 3 个月前
- 此快照最后确认于
- 2025/12/03 01:02 3 个月前
思路
观察subtask,发现要根据 的奇偶性分类讨论。
为奇数时没什么好说的,一层层走折线就可以经过所有方格。
重点是 为偶数的情况,这时肯定是走不到所有的方格的。最多走到 个方格。下面以 为例:
手画的,难看勿喷
最优情况下,左上到右下的对角线上的方格是走不到的。采用从外到内的走法,从当前最外层的右下角走起,折线走过四条边最后回到右下角,接着走下一圈,之后补齐右上到左下的对角线即可。实现时可以采用递归的方式。
code
CPP//头文件太长删掉了
#define _for(i,a,b) for(int i=(a);i<=(b);i++)
#define _rof(i,a,b) for(int i=(a);i>=(b);i--)
#define max(a,b) a>=b ? a:b
#define min(a,b) a<b ? a:b
using namespace std;
inline void solve(int x){
printf("%d %d\n",x,x);
if(x==n/2)return;
int flg=1;
_for(i,x+1,n-x){
printf("%d %d\n",i,x-flg);
flg^=1;
}
_for(i,x+1,n-x){
printf("%d %d\n",n-x+flg,i);
flg^=1;
}
_rof(i,n-x-1,x){
printf("%d %d\n",i,n-x+flg);
flg^=1;
}
_rof(i,n-x-1,x){
printf("%d %d\n",x-flg,i);
flg^=1;
}
solve(x+1);
}
signed main(){
scanf("%d",&n);
if(n&1){
printf("%d\n",n*n);
_for(i,1,n){
if(i%2){
_for(j,1,n)
printf("%d %d\n",j,i+((j%2==1)?0:-1));
}else{
_rof(j,n-1,0)
printf("%d %d\n",j,i+((j%2==0)?0:-1));
}
}
}else{
printf("%d\n",n*(n-1));
solve(1);
_for(i,n/2+1,n) printf("%d %d\n",i,i);
}
return 0;
}
相关推荐
评论
共 4 条评论,欢迎与作者交流。
正在加载评论...