求调试代码
  • 板块P5461 赦免战俘
  • 楼主Gohldg
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/11/20 22:52
  • 上次更新2023/11/21 13:24:13
查看原帖
求调试代码
757214
Gohldg楼主2023/11/20 22:52

void kil(int x,int y,int wx,int wy){
	if(x>n||y>n||wx>n||wy>n)return;
	for(int i=x;i<=wx;i++)
		for(int j=y;j<=wy;j++)a[i][j]=0;
//	cout <<"第"<<x<<"行第"<<y<<"列至第"<<wx<<"行第"<<wy<<"列区域清空\n"; 
	//Sleep(100);
}
void pus(int x,int y,int wilx,int wily){
	if(x>n||y>n)return;
	int l=(wilx-x+wily-y)/2;
	kil(x,y,x+l,y+l);//左上角 清空 
	pus(x+l,y,x+2*l,y+l);//左下角
	pus(x,y+l,x+l,y+2*l);//右上角 
	pus(x+l,y+l,x+2*l,y+2*l);//右下角 
}
//  1 2   3 4 
//1 0 0   0 1
//2 0 0   1 1
//  
//3 0 1   0 1
//4 1 1   1 1

kil函数表示清空从x行y列至wx行wy列的正方形区域

pus函数用于将区域分作4份,清空左上角的人(赦免)

然后继续分3个部分计算,但是出了问题

无论如何输出都是全0,完整代码如下:

#include <bits/stdc++.h>
#include <windows.h>
using namespace std;
int a[1200][1200],n;
void kil(int x,int y,int wx,int wy){
	if(x>n||y>n||wx>n||wy>n)return;
	for(int i=x;i<=wx;i++)
		for(int j=y;j<=wy;j++)a[i][j]=0;
//	cout <<"第"<<x<<"行第"<<y<<"列至第"<<wx<<"行第"<<wy<<"列区域清空\n"; 
	//Sleep(100);
}
void pus(int x,int y,int wilx,int wily){
	if(x>n||y>n)return;
	int l=(wilx-x+wily-y)/2;
	kil(x,y,x+l,y+l);//左上角 清空 
	pus(x+l,y,x+2*l,y+l);//左下角
	pus(x,y+l,x+l,y+2*l);//右上角 
	pus(x+l,y+l,x+2*l,y+2*l);//右下角 
}
//  1 2   3 4 
//1 0 0   0 1
//2 0 0   1 1
//  
//3 0 1   0 1
//4 1 1   1 1
int main(){
	cin>>n;
	n=pow(2,n);
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)a[i][j]=1;
	pus(1,1,n/2,n/2);//标记 
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++)cout <<a[i][j]<<" ";
		cout <<endl;
	}
	return 0;
}

注释的是调试代码,输出混乱,一个个处理后确实全空

所以感觉是pus函数分部分的步骤有问题

故发此贴,求帮助

2023/11/20 22:52
加载中...