#include #include #include using namespace std; int n,m,a,c,poeni[405][405],smer,red,prePoen,r,k,b,prosek,rezultat; char znakovi[405][405],znakTemp[405][405]; long long maxPoen; bool premalo; class praznaMatrica{ public: void setup(); void izmedju(); void straneRomba(); void naKraju(); void probniIspis(); void dalje(); private: int centar; int romb; int razdaljina; int br; }; void praznaMatrica::setup(){ centar = (m+1)/2; romb = m/2; if (m%2==0) romb--; razdaljina=a/prosek; znakovi[1][centar]='\\'; if (n%3!=1) znakovi[1][m]='\\'; if (m%2==1) znakovi[3][centar]='/'; else znakovi[3][centar]='\\'; if (n%3==2) { znakovi[n-1][1]='\\'; znakovi[n-1][m]='/'; } } void praznaMatrica::izmedju(){ for (int i=6;i<=n;i+=3) { znakovi[i-2][centar]='/'; znakovi[i-2][m]='/'; if (m%2==0) { znakovi[i][centar]='\\'; znakovi[i][m]='\\'; } else znakovi[i][centar]='/'; } } void praznaMatrica::straneRomba(){ for (int i=3;i<=n;i+=3) { for(int j=1;j<=centar-razdaljina;j++) { znakovi[i-1][j]='/'; znakovi[i][j]='\\'; } for(int j=centar+razdaljina;j<=m-1;j++) { znakovi[i-1][j]='\\'; znakovi[i][j]='/'; } if (m%2==1) { znakovi[i][m]='.'; znakovi[i-1][m]='\\'; } } } void praznaMatrica::naKraju(){ znakovi[n][1]='\\'; znakovi[n][m]='/'; if (m%2==0) znakovi[3][m]='\\'; } void praznaMatrica::probniIspis(){ for (int i=0;i<=n+1;i++){ for (int j=0;j<=m+1;j++){ cout<prePoen) { prePoen=maxPoen; red=i; } maxPoen=0; } int maxMatrica[17][17]; int tempMatrica[17][17]; int preMatrica[17][17]; int niz[100]; bool nemoze(){ int x=1; for (int i=1;i<=n;i++) for (int j=1;j<=m;j++,x++){ if (znakovi[i][j]!='.' && niz[x]==0) return true; } return false; } void malaMatrica(){ int granica=round(pow(3,n*m)); maxPoen=0; prePoen=0; for (int i=0;i0) cena+=a; else if (preMatrica[r][k]=='/' && niz[x]==2) cena+=c; else if (preMatrica[r][k]=='\\' && niz[x]==1) cena+=c; if (tempMatrica[r][k]=='.' || tempMatrica[r][k]=='x') { tempMatrica[r][k]='x'; if (smer==1) r--; if (smer==2) k++; if (smer==3) r++; if (smer==4) k--; } else if (tempMatrica[r][k]=='/') { tempMatrica[r][k]='x'; if (smer==1) { k++; smer=2; } else if (smer==2) { r--; smer=1; } else if (smer==3) { k--; smer=4; } else if (smer==4) { r++; smer=3; } } else { tempMatrica[r][k]='x'; if (smer==1) { k--; smer=4; } else if (smer==2) { r++; smer=3; } else if (smer==3) { k++; smer=2; } else if (smer==4) { r--; smer=1; } } } maxPoen-=cena; if (maxPoen>prePoen) { prePoen=maxPoen; for (int k=0;k<=n+1;k++) for (int l=0;l<=m+1;l++) maxMatrica[k][l]=znakovi[k][l]; red=j; } maxPoen=0; } } cout<>n>>m; cin>>a>>c; for (int i=0;i<=n+1;i++) for (int j=0;j<=m+1;j++) znakovi[i][j]='#'; for (int i=1;i<=n;i++) for (int j=1;j<=m;j++){ cin>>znakovi[i][j]; if (znakovi[i][j]!='.') b++; } for (int i=1;i<=n;i++) for (int j=1;j<=m;j++){ cin>>poeni[i][j]; prosek+=poeni[i][j]; } prosek/=n*m; } /// 0-. 1-/ 2-\ /// 1-gore 2-desno 3-dole 4-levo int main() { freopen("pinball.in","r",stdin); freopen("pinball.out","w",stdout); input(); /*if (n*m<=9) { malaMatrica(); }*/ if (b==0) { praznaMatrica prazno; prazno.setup(); prazno.izmedju(); prazno.straneRomba(); prazno.naKraju(); izracunaj(1); //prazno.probniIspis(); prazno.dalje(); } if (b>0 || premalo==true) { red=1; maxPoen=0; for (int i=1;i<=n;i++) { izracunaj(i); najboljiRed(i); } cout<