首页 > 代码库 > CodeForces 26C Parquet 构造题
CodeForces 26C Parquet 构造题
题目链接:点击打开链接
#include <stdio.h> #include <string.h> #include <iostream> #include <algorithm> #include <math.h> #include <set> using namespace std; #define N 105 int n,m,a,b,c; char s[N][N]; set<char>myset; bool inmap(int x,int y){return 0<=x&&x<n&&0<=y&&y<m;} int step[4][2] = {0,1,0,-1,1,0,-1,0}; void hehe(int x,int y){ for(int i = 0; i < 4; i++) { int nowx = step[i][0]+x,nowy = step[i][1]+y; if(!inmap(nowx,nowy)||!s[nowx][nowy])continue; myset.insert(s[nowx][nowy]); } } char find(int x1,int y1, int x2, int y2){ myset.clear(); for(int i = x1; i <= x2; i++) for(int j = y1; j <= y2; j++) hehe(i,j); for(int i = 0; i < 26; i++) if(myset.find(i+'a')==myset.end()) return i+'a'; } bool work(){ if((n&1)&&(m&1))return false; if(n*m > (2*a+2*b+4*c))return false; memset(s, 0, sizeof s); int h = 0, l = 0; if(n&1) { for(int i = 0; i < m; i+=2) s[0][i]=s[0][i+1]= find(0,i,0,i+1),a--; if(a<0)return false; h = 1; } if(m&1){ for(int i = 0; i < n; i+=2) s[i][0]=s[i+1][0]=find(i,0,i+1,0),b--; if(b<0)return false; l = 1; } a-=(a&1); b-=(b&1); if((n-h)*(m-l)>(2*a+2*b+4*c))return false; int i; for(i = h; i < n; i+=2) { int j = l; while(a>=2&&j<m) { s[i][j] = s[i][j+1] = find(i,j,i,j+1); s[i+1][j] = s[i+1][j+1] = find(i+1,j,i+1,j+1); j+=2; a-=2; } while(b>=2&&j<m) { s[i][j] = s[i+1][j] = find(i,j,i+1,j); s[i][j+1] = s[i+1][j+1] = find(i,j+1,i+1,j+1); j+=2; b-=2; } while(c&&j<m) { s[i][j] = s[i][j+1] = s[i+1][j] = s[i+1][j+1] = find(i,j,i+1,j+1); j+=2; c--; } if(j<m)return false; } if(i<n)return false; return true; } int main(){ while(~scanf("%d %d %d %d %d",&n,&m,&a,&b,&c)){ bool ans = work(); if(ans){ for(int i=0;i<n;i++)puts(s[i]); } else puts("IMPOSSIBLE"); } return 0; }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。