sgu-249 Matrix

来源:互联网 发布:软件产业基地1栋 编辑:程序博客网 时间:2024/05/20 13:08

题目大意:

给你一个2n2m(n,m<=20)的矩阵,要你把02(m+n)1填入矩阵中,使得相邻的两个数的二进制只有一位不同。

解题思路:

看到只有一位不同,很容易想到格雷码(G[i])(格雷码不会的话请先学习一下,因为本人太弱所以讲不清)。如果我们令(i,j)=G[i]2mG[j](i[0,n),j[0,m) ),我们将二进制后m位称为后半部分,那么我们发现同一行的前半部分是相同的,而后半部分是G[0]G[m1],而对于同一行,后半部分是相同的,前半部分是G[0]G[n1],所以相邻的都只有一位不同。所以满足题目要求。G[i]=i(i>>1)

AC代码:

#include <cstdio>#include <cstdlib>#include <cstring>#include <cmath>#include <algorithm>#include <iostream>using namespace std;int n,m;int main(){    scanf("%d%d",&n,&m);    for(int i=0;i<(1<<n);i++)    {        for(int j=0;j<(1<<m);j++)            printf("%d ",((i^(i>>1))<<m)|(j^(j>>1)));        puts("");    }    return 0;}
0 0
原创粉丝点击