ABC358F求助
  • 板块题目总版
  • 楼主linjunye
  • 当前回复2
  • 已保存回复2
  • 发布时间2024/6/16 11:13
  • 上次更新2024/6/16 14:02:01
查看原帖
ABC358F求助
745970
linjunye楼主2024/6/16 11:13
#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 两个点,请大佬看一下哪里有错。

2024/6/16 11:13
加载中...