问题描述
在一个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和此题比较类似大家可以参考