社区讨论

用的题解一的方法 为什么就对一个?

P1228地毯填补问题参与者 3已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@lo3jkzvb
此快照首次捕获于
2023/10/24 07:41
2 年前
此快照最后确认于
2023/10/24 07:41
2 年前
查看原帖
CPP
#include <stdio.h>
long long k, x, y;
long long t = 1;
void fun(long long  x, long long y, long long len, long long a, long long b);
int main()
{
	scanf("%lld", &k);
	scanf("%lld %lld", &x, &y);

	while (k!=0) {
		t *= 2;
		k--;
	}

	fun(x, y, t, 1, 1);
	return 0;
    
 }
void fun(long long  x, long long y, long long len, long long a, long long b) {
	if (len == 1)  return;
	if (x < a + len / 2 && y < b + len / 2) {
		printf("%lld %lld 1\n", a + len / 2 , b + len / 2 );
		fun(x ,y , len / 2, a, b);
		fun(a + len / 2-1 , b + len / 2 , len / 2, a, b+len/2);
		fun(a + len / 2 , b + len / 2 -1, len / 2, a+len/2, b);
		fun(a + len / 2 , b + len / 2 , len / 2, a+len/2, b+len/2);
	}
	else if (x < a + len / 2 && y >= b + len / 2) {
		printf("%lld %lld 2\n", a + len / 2 , b + len / 2 - 1);
		fun(a+len/2-1, b+len/2-1, len / 2, a, b);
		fun(x, y, len / 2, a, b + len / 2);
		fun(a + len / 2, b + len / 2 - 1, len / 2, a + len / 2, b);
		fun(a + len / 2, b + len / 2, len / 2, a + len / 2, b + len / 2);
	}
	else if (x >= a + len / 2 && y < b + len / 2) {
		printf("%lld %lld 3\n", a + len / 2 - 1, b + len / 2 );
		fun(a + len / 2 - 1, b + len / 2 - 1, len / 2, a, b);
		fun(a+len/2-1, y+len/2, len / 2, a, b + len / 2);
		fun(x , y, len / 2, a + len / 2, b);
		fun(a + len / 2, b + len / 2, len / 2, a + len / 2, b + len / 2);
	}
	else if (x >= a + len / 2 && y >= b + len / 2) {
		printf("%lld %lld 4\n", a + len / 2 -1, b + len / 2-1 );
		fun(a + len / 2 - 1, b + len / 2 - 1, len / 2, a, b);
		fun(a + len / 2 - 1, y + len / 2, len / 2, a, b + len / 2);
		fun(a + len / 2, b + len / 2 - 1, len / 2, a + len / 2, b);
		fun(x, y, len / 2, a + len / 2, b + len / 2);
	}
}

回复

2 条回复,欢迎继续交流。

正在加载回复...