问题
https://vjudge.net/problem/UVA-229
参考:https://blog.csdn.net/accelerator_/article/details/23036013
分析
一开始想复杂了,以为还要遍历所有的可能性,实际上只需要简单对比是否存在可以涂色的线,如果可以,那么就涂上去,一共73条线
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <map>
#include <string>
#include <vector>
#include <algorithm>
#include <queue>
using namespace std;
typedef long long LL;
const int maxn=100000+5,LNum[]={10,24,15,24};
int kase,grid[4][30],FB[4][30],FW[4][30],CB[4][30],CW[4][30],g[10][15],vis[4][30];
void init(){
for(int i=0;i<LNum[0];++i) grid[0][i]=15;
for(int i=0;i<LNum[2];++i) grid[2][i]=10;
for(int i=0;i<24;++i){
if(i<9) grid[1][i]=i+1;
else if(i>14) grid[1][i]=24-i;
else grid[1][i]=10;
}
for(int i=0;i<24;++i){
if(i<9) grid[3][i]=i+1;
else if(i>14) grid[3][i]=24-i;
else grid[3][i]=10;
}
}
void update(int x,int y,int color){
if(color==0) {
++CW[0][x];
++CW[1][x+y];
++CW[2][y];
++CW[3][9-(x-y)];
}else{
++CB[0][x];
++CB[1][x+y];
++CB[2][y];
++CB[3][9-(x-y)];
}
}
void draw(int x,int y,int color){
vis[x][y]=1;
if(x==0){
for(int i=0;i<15;++i){
if(g[y][i]==-1) {
g[y][i]=color;
update(y,i,color);
}
}
}else if(x==1){
if(y<9) {
for(int i=0;i<=y;++i) {
if(g[i][y-i]==-1){
g[i][y-i]=color;
update(i,y-i,color);
}
}
}else if(y>14){
for(int i=y-14;i<10;++i) {
if(g[i][y-i]==-1){
g[i][y-i]=color;
update(i,y-i,color);
}
}
}else{
for(int i=0;i<10;++i) {
if(g[i][y-i]==-1){
g[i][y-i]=color;
update(i,y-i,color);
}
}
}
}else if(x==2){
for(int i=0;i<10;++i){
if(g[i][y]==-1){
g[i][y]=color;
update(i,y,color);
}
}
}else{
if(y<9) {
for(int i=9-y;i<10;++i) {
if(g[i][y+i-9]==-1){
g[i][y+i-9]=color;
update(i,y+i-9,color);
}
}
}else if(y>14){
for(int i=0;i<24-y;++i) {
if(g[i][y+i-9]==-1){
g[i][y+i-9]=color;
update(i,y+i-9,color);
}
}
}else{
for(int i=0;i<10;++i) {
if(g[i][y+i-9]==-1){
g[i][y+i-9]=color;
update(i,y+i-9,color);
}
}
}
}
}
void read(){
for(int i=0;i<4;++i){
for(int j=0;j<LNum[i];++j){
scanf("%d",&FB[i][j]);
FW[i][j]=grid[i][j]-FB[i][j];
}
}
}
bool find(){
for(int i=0;i<4;++i){
for(int j=0;j<LNum[i];++j){
if(vis[i][j]) continue;
//这一条线上的白色已经涂满了,剩下的都是黑的
if(CW[i][j]==FW[i][j]){
draw(i,j,1);
return true;
}
//剩下的都是白的
if(CB[i][j]==FB[i][j]){
draw(i,j,0);
return true;
}
}
}
return false;
}
void solve(){
int cnt=0;
while(find()){
++cnt;
}
if(cnt!=73) memset(g,0,sizeof(g));
for(int i=0;i<10;++i){
for(int j=0;j<15;++j){
printf("%c",g[i][j]?'#':'.');
}
printf("\n");
}
if(kase) printf("\n");
}
int main(void){
// freopen("../Ch01_ex/UVA229_in.txt","r",stdin);
// freopen("../Ch01_ex/UVA229_out.txt","w",stdout);
scanf("%d",&kase);
init();
while(kase--){
memset(CB,0,sizeof(CB));
memset(CW,0,sizeof(CW));
memset(g,-1,sizeof(g));
memset(vis,0,sizeof(vis));
read();
solve();
}
return 0;
}