题解
1.最小距离是n+m-2
2.后退多少就要前进多少,所以合法距离一定是偶数
3.猜测并验证n+m,n+m+2,n+m+4是否可行
4.如果n+m,我可以在终点设一个弯
5.如果n+m+2,我可以在起点设一个弯
6.两个弯可以组成任意偶数
code
#include<bits/stdc++.h>
using namespace std;
int n,m,k;
void solve()
{
char a[20][20],b[20][20];
for(int i=1;i<=n;i++)
{
for(int j=1;j<m;j++)
{
a[i][j]='B';
}
}
for(int i=1;i<n;i++)
{
for(int j=1;j<=m;j++)
{
b[i][j]='B';
}
}
if(k<n+m-2||(k-n-m)%2)
{
puts("no");
return;
}
puts("yes");
int op=0;
for(int i=1;i<m;i++)
{
if(!op) a[1][i]='R';
else a[1][i]='B';
op^=1;
}
a[2][1]='R';
if((n+m)%2)
{
a[n-1][m-1]='R';
a[n][m-1]='R';
}
else
{
a[n-1][m-1]='B';
a[n][m-1]='B';
}
for(int i=1;i<n;i++)
{
if(!op) b[i][m]='R';
else b[i][m]='B';
op^=1;
}
b[1][1]='B';
b[1][2]='B';
if((n+m)%2)
{
b[n-1][m-1]='B';
}
else
{
b[n-1][m-1]='R';
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<m;j++)
{
if(!a[i][j]) cout<<"R ";
else cout<<a[i][j]<<" ";
}
puts("");
}
for(int i=1;i<n;i++)
{
for(int j=1;j<=m;j++)
{
if(!b[i][j]) cout<<"R ";
else cout<<b[i][j]<<" ";
}
puts("");
}
}
int main()
{
int t;
cin>>t;
while(t--)
{
cin>>n>>m>>k;
solve();
}
return 0;
}
标签:20,Colorful,int,偶数,Grid,solve
From: https://www.cnblogs.com/pure4knowledge/p/18251477