題目大意:給定一個 n∗m n*m的矩陣,要求用正方形磚塊覆蓋,使得任意兩塊同顏色的正方形磚塊不相鄰且字典序最小
枚舉每一塊磚,如果這個位置為空白,就填入字典序最小的磚塊,然後將邊長一格格拓展
如果當前右側位置可以填入字典序更小的磚塊,就不拓展
否則判斷能否拓展並拓展
#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#define M 110using namespace std;int m,n;char ans[M][M];bool Able(int x,int y,char c){ static const int dx[]={1,-1,0,0}; static const int dy[]={0,0,1,-1}; int i; for(i=0;i<4;i++) if(ans[x+dx[i]][y+dy[i]]==c) return false; return true;}void Extend(int x,int y){ int i,j; for(i='A';i<='Z';i++) if(Able(x,y,i)) { ans[x][y]=i; break; } for(i=2;x+i-1<=m&&y+i-1<=n;i++) { for(j='A';j<ans[x][y];j++) if(Able(x,y+i-1,j)) return ; for(j=x;j<=x+i-1;j++) if(ans[j][y+i-1]) return ; for(j=y;j<=y+i-1;j++) if(ans[x+i-1][j]) return ; if(ans[x-1][y+i-1]==ans[x][y]) return ; if(ans[x+i-1][y-1]==ans[x][y]) return ; for(j=x;j<=x+i-1;j++) if(ans[j][y+i]==ans[x][y]) return ; for(j=y;j<=y+i-1;j++) if(ans[x+i][j]==ans[x][y]) return ; for(j=x;j<=x+i-1;j++) ans[j][y+i-1]=ans[x][y]; for(j=y;j<=y+i-1;j++) ans[x+i-1][j]=ans[x][y]; }}int main(){ int i,j; cin>>m>>n; for(i=1;i<=m;i++) for(j=1;j<=n;j++) if(!ans[i][j]) Extend(i,j); for(i=1;i<=m;i++) puts(ans[i]+1); return 0;}