站外试题求助(听取“蛙”声一片)
  • 板块题目总版
  • 楼主RockyQ012
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/5/15 22:19
  • 上次更新2024/5/16 13:25:49
查看原帖
站外试题求助(听取“蛙”声一片)
1299348
RockyQ012楼主2024/5/15 22:19

问题描述

在一个2k x 2k(1<=k<=10)个方格组成的棋盘中,恰有一个方格是黑色的,其他方格都是白色。你的任务是要用图示的由三个方格构成的4种不同形态的L型骨牌覆盖所有的白色方格,且任何一个白色方格不能同时被两次或多个次覆盖。

输入格式

第一行一个整数k,表示棋盘的大小为2k x 2k 第二行是两个整数,代表特殊方格所在行号和列号。

输出格式

一个以空格为间隔的2k x 2k数字矩阵,表示一种可行的覆盖方案 同一块骨牌用相同的数字表示,用数字0表示黑色方格 按矩阵从左到右,从上到下的顺序将数字由小到大输出,详情见样例。

样例输入:2 2 1

样例输出;

1 1 2 2

0 1 3 2

4 3 3 5

4 4 5 5

下面是我的错误代码:

#include <bits/stdc++.h>
using namespace std;
const int N = 1500;
int a[N][N] , c[N][N];
int id = 0;
int v[2250000];
void divide(int n , int flagx , int flagy , int x , int y) {
	id++;
	int len = pow(2 , n - 1);
	if(n == 0) return ;
	if(flagx < x + len && flagy < y + len) {
		a[x + len - 1][y + len] = id;
		a[x + len][y + len - 1] = id;
		a[x + len][y + len] = id;
		divide(n - 1 , flagx , flagy , x , y);
		divide(n - 1 , x + len - 1 , y + len , x , y + len);
		divide(n - 1 , x + len , y + len - 1 , x + len , y);
		divide(n - 1 , x + len , y + len , x + len , y + len);
	} else if(flagx < x + len && flagy >= y + len) {
		a[x + len - 1][y + len - 1] = id;
		a[x + len][y + len - 1] = id;
		a[x + len][y + len] = id;
		divide(n - 1 , x + len - 1 , y + len - 1, x , y);
		divide(n - 1 , flagx , flagy , x , y + len);
		divide(n - 1 , x + len , y + len - 1 , x + len , y);
		divide(n - 1 , x + len , y + len , x + len , y + len);
	} else if(flagx >= x + len && flagy < y + len) {
		a[x + len - 1][y + len - 1] = id;
		a[x + len - 1][y + len] = id;
		a[x + len][y + len] = id;
		divide(n - 1 , x + len - 1 , y + len - 1, x , y);
		divide(n - 1 , x + len - 1, y + len , x , y + len);
		divide(n - 1 , flagx , flagy , x + len , y);
		divide(n - 1 , x + len , y + len , x + len , y + len);
	} else {
		a[x + len - 1][y + len - 1] = id;
		a[x + len - 1][y + len] = id;
		a[x + len][y + len - 1] = id;
		divide(n - 1 , x + len - 1 , y + len - 1, x , y);
		divide(n - 1 , x + len - 1 , y + len , x , y + len);
		divide(n - 1 , x + len , y + len - 1, x + len, y);
		divide(n - 1 ,  flagx , flagy , x + len , y + len);
	}
}
void ogday(int size) {
	int num = 1;
	for (int i = 1; i < size; ++i) {
		for (int j = 1; j < size; ++j) {
			if(a[i][j] != 0 && !v[a[i][j]]) {
				v[a[i][j]] = num;
				c[i][j] = num;
				num++;
			}
			c[i][j] = v[a[i][j]];
		}
		cout << "\n";
	}
}
int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	int k;
	cin >> k;
	int flagx, flagy;
	cin >> flagx >> flagy;
	a[flagx - 1][flagy - 1] = 0;
	divide(k, flagx - 1, flagy - 1, 0, 0);
	for (int i = 0; i < 2 * k; ++i) {
		for (int j = 0; j < 2 * k; ++j) {
			cout << a[i][j] << " ";
		}
		cout << "\n";
	}
	return 0;
}

请大家帮忙修改,洛谷上还有一道p1228和此题比较类似大家可以参考

2024/5/15 22:19
加载中...