题解:CF2261F1 Plegma II: Ask Me Any Cell (Easy Version)
shiziyu111
·
·
题解
先考虑 $1\times n$ 的情况下怎么做。
首先有一个很 naive 的想法:将其强行分隔为 `11..111000..000` 的形式,再看是否有 `1`,有 `1` 删左边,否则删右边。
然后我们发现这样子完全没必要,有 `1` 与否只需要有 $1$ 个 `1` 即可,于是我们将其改为 `00000...100000000` 的形式。
接下来考虑如何扩展到 $n\times n$,由于 $k=24$,所以说我们还剩下 $4$ 个 `0`,考虑使用某种东西来存储到底应该删上面还是下面。
我们先想出一个理想的情况,在刚好删完目标点上面一排后状态就会改变,而且只需要删除很少个 `0` 就能改变。
没错,这个状态就是奇偶性。
于是我们考虑根据奇偶性决定删除上面还是下面,在目标点上面一排放上一个 `0`,下面根据整体奇偶性决定是否放 `0`,然后就做完了。
# Code
代码有点丑。
```cpp
#include<bits/stdc++.h>
using namespace std;
#define int long long
string s[28]={"","111","111","001","011","111","100","110","110","110","010","111","111","111","111","111","010","111","101","111","111","110","111","011","111","011","010","111"};
int ans[25][25];
void solve(int r,int c)
{
memset(ans,0,sizeof(ans));
//for(int i=1;i<c;i++)
//{
// ans[r][i]=1;
//}
ans[r][c-1]=1;
for(int i=1;i<r;i++)
{
for(int j=1;j<=20;j++)
{
ans[i][j]=1;
}
}
ans[r-1][1]=0;
if(c!=1&&r==20)
{
ans[r-1][1]=1;
}
for(int i=r+1;i<=20;i++)
{
for(int j=1;j<=20;j++)
{
ans[i][j]=1;
}
}
ans[r+1][1]=((c==1))&1;
for(int i=1;i<=20;i++)
{
for(int j=1;j<=20;j++)
{
printf("%lld",ans[i][j]);
}
printf("\n");
}
printf("\n");
}
signed main()
{
int n;
scanf("%lld",&n);
if(n==3)
{
for(int i=1;i<=27;i++)
{
cout<<s[i]<<"\n";
if(i%3==0)
{
printf("\n");
}
}
printf("DURLDULRUU");
}
else
{
//solve(1,3);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
solve(i,j);
}
}
printf("RL");
for(int i=2;i<n;i++)
{
printf("U");
}
for(int i=n;i<=n*n;i++)
{
if(i&1)
{
printf("U");
}
else
{
printf("D");
}
}
}
return 0;
}
```