到底哪里错了
  • 板块题目总版
  • 楼主count_year
  • 当前回复2
  • 已保存回复2
  • 发布时间2023/11/16 15:58
  • 上次更新2023/11/16 17:30:38
查看原帖
到底哪里错了
705729
count_year楼主2023/11/16 15:58

各位大佬帮我看看哪里错了

题目:

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

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

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

代码:

#include<bits/stdc++.h>
using namespace std;
int cnt=1;
int f[20001][20001];
int t[20000001];
void asd(int a,int b,int x,int y,int n){
	if(n==1){
		return;
	}
	int c=n/2;
	int t=cnt++;
	if(a<x+c&&b<y+c){
		asd(a,b,x,y,c);
	}else{
		f[x+c-1][y+c-1]=t;
		asd(x+c-1,y+c-1,x,y,c);
	}
	if(a>=x+c&&b<y+c){
		asd(a+c,b,x+c,y,c);
	}else{
		f[x+c][y+c-1]=t;
		asd(x+c,y+c-1,x+c,y,c);
	}
	if(a<x+c&&b>=y+c){
		asd(a,b+c,x,y+c,c);
	}else{
		f[x+c-1][y+c]=t;
		asd(x+c-1,y+c,x,y+c,c);
	}
	if(a>=x+c&&b>=y+c){
		asd(a+c,b+c,x+c,y+c,c);
	}else{
		f[x+c][y+c]=t;
		asd(x+c,y+c,x+c,y+c,c);
	}
} 
int id=0;
int main(){
	int n;
	int x,y;
	cin>>n;
	cin>>x>>y;
	asd(x-1,y-1,0,0,pow(2,n));
	for(int i=0;i<pow(2,n);i++){
		for(int j=0;j<pow(2,n);j++){
			if(!t[f[i][j]]&&f[i][j]){
				t[f[i][j]]=++id;
			}
			cout<<t[f[i][j]]<<" ";
		}
		cout<<endl;
	}
	return 0;
}
2023/11/16 15:58
加载中...