P5461 赦免战俘(递归/找规律)C++

P5461 赦免战俘

在这里插入图片描述
在这里插入图片描述

可以找规律做这道题
每一个数字都是它上方数字加上右上方数字再模2。
其实就是不进位加法,异或一下就好了。

#include<iostream>
#include<stdio.h>
#include<iomanip>
#include<stack>
#include<set> 
#include<queue>
#include<cstdlib>
#include <algorithm>
#include<string.h>
#include<math.h>
#define llu unsigned long long
using namespace std;

int a[1234][1234];
int main()
{
    
    
	int n;
	cin >> n ;
	n=1<<n;//如果n=2,那么位移之后就变成了100,也就是十进制4,也就是2的n次方
	a[0][n+1]=1;
	for(int i=1;i<=n;i++) 
	{
    
    
		for(int j=1;j<=n;j++)
		{
    
    
			a[i][j]=a[i-1][j]^a[i-1][j+1];
			cout << a[i][j] << " " ;
		}
		cout << endl ;
	}
	
    return 0;
}

也可以用递归
做法就是将当前矩阵的左上一块标记上,然后递归进剩下三块继续做,如果当前矩阵为 1×1 直接退出递归即可。

#include<iostream>
#include<stdio.h>
#include<iomanip>
#include<stack>
#include<set> 
#include<queue>
#include<cstdlib>
#include <algorithm>
#include<string.h>
#include<math.h>
#define llu unsigned long long
using namespace std;

char a[1234][1234];
void dfs(int x,int y,int xx,int yy)
{
    
    
	if(x==xx&&y==yy)return ;
	int tx=(x+xx)/2,ty=(y+yy)/2;
	for(int i=x;i<=tx;i++)
	{
    
    
		for(int j=y;j<=ty;j++)
			a[i][j]='0';
	}
	dfs(x,ty+1,tx,yy);
	dfs(tx+1,y,xx,ty);
	dfs(tx+1,ty+1,xx,yy);
}


int main()
{
    
    
	int n;
	cin >> n ;
	n=1<<n;//如果n=2,那么位移之后就变成了100,也就是十进制4,也就是2的n次方
	memset(a,'1',sizeof(a));
	
	dfs(1,1,n,n);
	
	for(int i=1;i<=n;i++) 
	{
    
    
		for(int j=1;j<=n;j++)
		{
    
    
			cout << a[i][j] << " " ;
		}
		cout << endl ;
	}
	
    return 0;
}

猜你喜欢

转载自blog.csdn.net/wangyurenwls/article/details/118757761