#include<bits/stdc++.h>
using namespace std;
int n,m,k,row,col;
char ans[1010][1010];
void go_left(int &row,int &col,int p){
for(int i=1;i<=p;i++){
ans[row*2][2*col-1]='.';
col--;
}
return;
}
void go_right(int &row,int &col,int p){
for(int i=1;i<=p;i++){
ans[row*2][2*col+1]='.';
col++;
}
return;
}
void go_up(int &row,int &col,int p){
for(int i=1;i<=p;i++){
ans[row*2-1][2*col]='.';
row--;
}
return;
}
void go_down(int &row,int &col,int p){
for(int i=1;i<=p;i++){
ans[row*2+1][2*col]='.';
row++;
}
return;
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n>>m>>k;
if(k>n*m||k<n||(k-n)%2==1||n==1&&k>1){
/*
为什么(k-n)%2=1不合法呢
因为k在往下走n层时,如果k>n,那么可以在图中左右移动
可以证明,向左移动次数=向右移动次数
*/
cout<<"No";
return 0;
}
cout<<"Yes\n";
//设计地图
for(int i=1;i<=2*n+1;i++)
for(int j=1;j<=2*m+1;j++){
if(i==1&&j==2*m)ans[i][j]='S';
else if(i==2*n+1&&j==2*m)ans[i][j]='G';
else if(i==1||i==2*n+1)ans[i][j]='+';
else if(j==1||j==2*m+1)ans[i][j]='+';
else if(i%2==1&&j%2==1)ans[i][j]='+';
else if(i%2==0&&j%2==0)ans[i][j]='o';
else if(i%2==0&&j%2==1)ans[i][j]='|';
else ans[i][j]='-';
}
row=1;col=m;
//构造地图
//容易发现,左边做(k-n)/2下,右边做(k-n)/2下
//但是只针对(k-n)mod 4=0时有效
if(k<=m*(n-1)+1||n%2==0){//可以这么走
int move=(k-n)/2;
while(move){
int mn=min(move,m-1);
go_left(row,col,mn);
go_down(row,col,1);
go_right(row,col,mn);
go_down(row,col,1);
move-=mn;
}
go_down(row,col,n-row);
}
else{//要利用好每一个点
go_left(row,col,m-1);
go_down(row,col,n-1);
k-=n+m-1;
int move=(k-m+1)/2;//注意现在是上上下下
while(move){
int mn=min(move,n-2);
go_right(row,col,1);
go_up(row,col,mn);
go_right(row,col,1);
go_down(row,col,mn);
move-=mn;
}
go_right(row,col,m-col);
}
for(int i=1;i<=2*n+1;i++,cout<<"\n")
for(int j=1;j<=2*m+1;j++){
if(i==2*n+1&&j==2*m)ans[i][j]='G';
cout<<ans[i][j];
}
return 0;
}
一直 WA 两个点,请大佬看一下哪里有错。