题目链接:http://codeforces.com/contest/610/problem/C
解题思路:
将后一个矩阵拆分为四个前一状态矩阵,其中三个与前一状态相同,剩下一个直接取反就行。还有很多种取法,这种比较方便就是。
实现代码:
#include<iostream> #include<string> #include<cmath> using namespace std; int a[1025][1025],b[1025][1025]; int main() { int n; cin>>n; int k = 0,t1=0,t0=0,i,j; while(k<=n){ k++; t1=1<<(k); t0=1<<(k-1); b[1][1] = 1; for(i=1;i<=t0;i++) for(j=1;j<=t0;j++) b[i][j] = b[t0+i][j]=b[i][j+t0]=a[i][j]; for(i=1;i<=t0;i++) for(j=1;j<=t0;j++) b[i+t0][j+t0]= 1- a[i][j]; for(i=1;i<=t1;i++) for(j=1;j<=t1;j++) a[i][j] = b[i][j]; } for(i=1;i<=(1<<n);i++){ for(j=1;j<=(1<<n);j++){ if(a[i][j]==1) cout<<"+"; else cout<<"*"; } cout<<endl; } return 0; }