题意:
就是给一个无限平面,每个整数点有颜色(初始为0).
有n种蜡笔,颜色[1,n],涂第i种颜色的笔时,[i-4,i-1]这4种颜色需要在当前位置的周围(忽略负数)
你需要给出一些操作,使得至少一个点是第n种颜色
解析:
考虑是否存在一种情况构造每个点n时,上方总是 n − a n-a n−a,左边 n − b n-b n−b,右边 n − c n-c n−c,下边 n − d n-d n−d,其中 a , b , c , d ∈ [ 1 , 4 ] a,b,c,d\in[1,4] a,b,c,d∈[1,4]。
代码:
/*
* Author : Jk_Chen
* Date : 2020-08-02-15.38.49
*/
#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define LD long double
#define rep(i,a,b) for(int i=(int)(a);i<=(int)(b);i++)
#define per(i,a,b) for(int i=(int)(a);i>=(int)(b);i--)
#define mmm(a,b) memset(a,b,sizeof(a))
#define pb push_back
#define pill pair<int, int>
#define fi first
#define se second
void test(){cerr<<"\n";}
template<typename T,typename... Args>void test(T x,Args... args){cerr<<"> "<<x<<" ";test(args...);}
const LL mod=1e9+7;
const int maxn=1e5+9;
const int inf=0x3f3f3f3f;
LL rd(){ LL ans=0; char last=' ',ch=getchar();
while(!(ch>='0' && ch<='9'))last=ch,ch=getchar();
while(ch>='0' && ch<='9')ans=ans*10+ch-'0',ch=getchar();
if(last=='-')ans=-ans; return ans;
}
#define rd rd()
/*_________________________________________________________begin*/
int v[1009][1009];
int ans;
void dfs(int x,int y,int val){
if(val>0&&v[x][y+1]!=val-1){
dfs(x,y+1,val-1);
}
if(val>1&&v[x+1][y]!=val-2){
dfs(x+1,y,val-2);
}
if(val>2&&v[x-1][y]!=val-3){
dfs(x-1,y,val-3);
}
if(val>3&&v[x][y-1]!=val-4){
dfs(x,y-1,val-4);
}
v[x][y]=val;
//ans++;
printf("%d %d %d\n",x,y,val);
}
int main(){
dfs(500,500,rd);
//printf("%d\n",ans);
return 0;
}
/*_________________________________________________________end*/