Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- int n,m,p,ej,ei,k,sj,si,un,kn;
- string h[101];
- string r[101],l[101];
- int dx[]={-1,-1,-1,0,0,1,1,1};
- int dy[]={-1,0,1,1,-1,-1,0,1};
- vector<vector<string> > v;
- double c,cee;
- int kno()
- {
- int res=0;
- for (int i=0;i<n;++i) for (int j=0;j<m;++j) if (h[i][j]!='?')
- {
- ++res;
- ei=max(ei,i+1);
- ej=max(ej,j+1);
- si=min(si,i);
- sj=min(sj,j);
- }
- return res;
- }
- bool ok(int i,int j)
- {
- return (i>=si && j>=sj && i<ei && j<ej);
- }
- int sir;
- bool doe;
- string e[101];
- int o[101][101];
- void rek(int i,int j)
- {
- //cout<<i<<' '<<j<<endl;
- if ((clock()-cee)/CLOCKS_PER_SEC>9.5)
- {
- cout<<0<<endl;
- exit(0);
- }
- if (v.size()>40000) doe=1;
- if (doe) return;
- if (j==ej)
- {
- j=sj;
- ++i;
- }
- //if (!ok(i,j)) return;
- bool up=1;
- for (int k=0;k<8;++k) if (ok(i+dx[k],j+dy[k]) && r[i+dx[k]][j+dy[k]]!='?') up=0;
- //if (i>7) cout<<i<<' '<<j<<' '<<ei<<endl;
- if ((up/* || un>15*/) && i!=ei && n*m-kn>15)
- {
- ++sir;
- rek(i,j+1);
- --sir;
- return;
- }
- //cout<<i<<' '<<j<<endl;
- if (i==ei)
- {
- //cout<<v.size()<<endl;
- for (int i=0;i<n;++i)
- {
- for (int j=0;j<m;++j) o[i][j]=0;
- e[i].clear();
- }
- int mi=0;
- for (int i=0;i<n;++i) for (int j=0;j<m;++j) if (h[i][j]=='*') ++mi;
- //for (int i=0;i<n;++i) cout<<h[i]<<endl;
- //cout<<endl;
- if (mi!=p && sir==0 && p!=-1) return;
- for (int i=0;i<n;++i) for (int j=0;j<m;++j) if (h[i][j]=='*') for (int k=0;k<8;++k) if (ok(i+dx[k],j+dy[k])) ++o[i+dx[k]][j+dy[k]];
- for (int i=0;i<n;++i) for (int j=0;j<m;++j)
- {
- if (h[i][j]=='.') e[i].push_back(o[i][j]+'0');
- else e[i].push_back(h[i][j]);
- }
- for (int i=si;i<ei;++i) for (int j=sj;j<ej;++j)
- {
- if (e[i][j]!='*' && e[i][j]!='?' && o[i][j]!=e[i][j]-'0')
- {
- /*for (int i=0;i<n;++i) cout<<e[i]<<endl;
- for (int i=si;i<ei;++i) for (int j=sj;j<ej;++j) cout<<o[i][j]<<" \n"[j==(m-1)];
- cout<<endl;*/
- return;
- }
- }
- vector<string> x;
- for (int i=0;i<n;++i)
- {
- //cout<<e[i]<<endl;
- x.push_back(e[i]);
- }
- v.push_back(x);
- }
- else if (h[i][j]=='?')
- {
- ++un;
- //cout<<i<<' '<<j<<endl;
- h[i][j]='.';
- bool moz=1;
- for (int k=0;k<8;++k) if (ok(i+dx[k],j+dy[k]))
- {
- int i1=i+dx[k],j1=j+dy[k];
- if (h[i1][j1]<'0' || h[i1][j1]>'8') continue;
- bool look=1;
- int mi=0;
- for (int k=0;k<8;++k) if (ok(i1+dx[k],j1+dy[k]))
- {
- if (h[i1+dx[k]][j1+dy[k]]=='?')
- {
- look=0;
- break;
- }
- if (h[i1+dx[k]][j1+dy[k]]=='*') ++mi;
- }
- if (!look) continue;
- if (mi!=h[i1][j1]-'0')
- {
- moz=0;
- break;
- }
- }
- if (moz) rek(i,j+1);
- h[i][j]='*';
- moz=1;
- for (int k=0;k<8;++k) if (ok(i+dx[k],j+dy[k]))
- {
- int i1=i+dx[k],j1=j+dy[k];
- if (h[i1][j1]<'0' || h[i1][j1]>'8') continue;
- bool look=1;
- int mi=0;
- for (int k=0;k<8;++k) if (ok(i1+dx[k],j1+dy[k]))
- {
- if (h[i1+dx[k]][j1+dy[k]]=='?')
- {
- look=0;
- break;
- }
- if (h[i1+dx[k]][j1+dy[k]]=='*') ++mi;
- }
- if (!look) continue;
- if (mi!=h[i1][j1]-'0')
- {
- moz=0;
- break;
- }
- }
- if (moz) rek(i,j+1);
- --un;
- h[i][j]='?';
- }
- else
- {
- if (h[i][j]>'8' || h[i][j]<'0')
- {
- rek(i,j+1);
- return;
- }
- int mini=0;
- for (int k=0;k<8;++k) if (ok(i+dx[k],j+dy[k]) && h[i+dx[k]][j+dy[k]]=='*') ++mini;
- if (mini>h[i][j]-'0') return;
- int pos=0;
- for (int k=0;k<8;++k) if (ok(i+dx[k],j+dy[k]))
- {
- pos+=(h[i+dx[k]][j+dy[k]]=='*' || h[i+dx[k]][j+dy[k]]=='?');
- }
- if (pos<h[i][j]-'0') return;
- rek(i,j+1);
- //cout<<"Nothing. "<<i<<' '<<j+1<<endl;
- }
- }
- int main () {
- cin>>n>>m>>k;
- cout<<n/2<<' '<<m/2<<endl;
- cee=clock();
- ej=0;
- ei=0;
- si=n;
- sj=m;
- while (1)
- {
- for (int i=0;i<n;++i)
- {
- cin>>h[i];
- if (h[i]=="Wrong") return 0;
- }
- for (int i=0;i<n;++i) l[i]=h[i];
- if (kno()==n*m) return 0;
- un=0;
- vector<pair<pair<int,int>,char> > conc;
- eas:
- //cout<<endl;
- //for (int i=0;i<n;++i) cout<<h[i]<<endl;
- //cout<<endl;
- for (int i=0;i<n;++i) for (int j=0;j<m;++j)
- {
- int pos=0,que=0;
- vector<pair<int,int> > qu;
- for (int k=0;k<8;++k) if (i+dx[k]>=0 && i+dx[k]<n && j+dy[k]>=0 && j+dy[k]<m)
- {
- pos+=(h[i+dx[k]][j+dy[k]]=='*' || h[i+dx[k]][j+dy[k]]=='?');
- que+=(h[i+dx[k]][j+dy[k]]=='?');
- if (h[i+dx[k]][j+dy[k]]=='?') qu.push_back({i+dx[k],j+dy[k]});
- }
- if (pos==h[i][j]-'0' && que)
- {
- for (int k=0;k<8;++k) if (i+dx[k]>=0 && i+dx[k]<n && j+dy[k]>=0 && j+dy[k]<m) if (h[i+dx[k]][j+dy[k]]=='?') h[i+dx[k]][j+dy[k]]='*';
- goto eas;
- }
- if (pos-que==h[i][j]-'0' && que)
- {
- for (int k=0;k<8;++k) if (i+dx[k]>=0 && i+dx[k]<n && j+dy[k]>=0 && j+dy[k]<m) if (h[i+dx[k]][j+dy[k]]=='?') h[i+dx[k]][j+dy[k]]='.';
- goto eas;
- }
- for (int k=0;k<8;++k) if (i+dx[k]>=0 && i+dx[k]<n && j+dy[k]>=0 && j+dy[k]<m)
- {
- int i1=i+dx[k],j1=j+dy[k];
- if (!(h[i][j]>='0' && h[i][j]<='9') || !(h[i1][j1]>='0' && h[i1][j1]<='9')) continue;
- int pos1=0,que1=0;
- vector<pair<int,int> > qu1;
- for (int k=0;k<8;++k) if (i1+dx[k]>=0 && i1+dx[k]<n && j1+dy[k]>=0 && j1+dy[k]<m)
- {
- pos1+=(h[i1+dx[k]][j1+dy[k]]=='*' || h[i1+dx[k]][j1+dy[k]]=='?');
- que1+=(h[i1+dx[k]][j1+dy[k]]=='?');
- if (h[i1+dx[k]][j1+dy[k]]=='?') qu1.push_back({i1+dx[k],j1+dy[k]});
- }
- int he=h[i][j]-'0'-(pos-que);
- int he1=h[i1][j1]-'0'-(pos1-que1);
- if (i1==1 && i==1 && j==6 && j1==5)
- {
- /*cout<<pos<<' '<<que<<' '<<pos1<<' '<<que1<<' '<<he<<' '<<he1<<endl;
- for (auto x: qu) cout<<x.first<<' '<<x.second<<endl;
- cout<<endl;
- for (auto x: qu1) cout<<x.first<<' '<<x.second<<endl;
- cout<<endl;*/
- }
- if (he<he1) continue;
- int in=0;
- for (auto x: qu) if (find(qu1.begin(),qu1.end(),x)==qu1.end()) ++in;
- if (in==0) continue;
- if (in==he-he1)
- {
- for (auto x: qu) if (find(qu1.begin(),qu1.end(),x)==qu1.end()) h[x.first][x.second]='*';
- goto eas;
- }
- if (he==he1 && in)
- {
- int in1=0;
- for (auto x: qu1) if (find(qu.begin(),qu.end(),x)==qu.end()) ++in1;
- if (in1) continue;
- for (auto x: qu) if (find(qu1.begin(),qu1.end(),x)==qu1.end()) h[x.first][x.second]='.';
- goto eas;
- }
- }
- }
- for (int i=0;i<n;++i) for (int j=0;j<m;++j) if (h[i][j]!=l[i][j]) conc.push_back({{i,j},h[i][j]});
- //for (int i=0;i<n;++i) cout<<h[i]<<endl;
- if (conc.size())
- {
- cout<<conc.size()<<endl;
- for (auto x: conc)
- {
- cout<<x.first.first<<' '<<x.first.second<<' '<<x.second<<endl;
- h[x.first.first][x.first.second]=x.second;
- }
- //for (int i=0;i<n;++i) cout<<h[i]<<endl;
- continue;
- }
- //cout<<endl;
- //for (int i=0;i<n;++i) cout<<h[i]<<endl;
- kn=kno();
- doe=0;
- for (int i=0;i<n;++i) r[i]=h[i];
- if (si || sj || ei-n || ej-m) p=-1;
- else p=k;
- si=0;
- sj=0;
- ei=n;
- ej=m;
- v.clear();
- //cout<<si<<' '<<sj<<endl<<ei<<' '<<ej<<endl;
- c=clock();
- rek(si,sj);
- //cout<<si<<' '<<sj<<endl<<ei<<' '<<ej<<endl;
- /*for (auto x: v)
- {
- for (auto y: x) cout<<y<<endl;
- cout<<endl;
- }*/
- for (int i=0;i<n;++i)
- {
- for (int j=0;j<m;++j)
- {
- if (l[i][j]!='?') continue;
- //cout<<i<<' '<<j<<endl;
- if (v[0][i][j]=='?') continue;
- char a=v[0][i][j];
- for (int k=1;k<v.size();++k) if (v[k][i][j]!=a)
- {
- a='?';
- break;
- }
- if (a=='?' && v[0][i][j]!='*')
- {
- a='.';
- for (int k=1;k<v.size();++k) if (v[k][i][j]=='*')
- {
- a='?';
- break;
- }
- }
- if (a=='?') continue;
- if (a=='*') conc.push_back({{i,j},'*'});
- else conc.push_back({{i,j},'.'});
- }
- }
- if (conc.size()==0)
- {
- int mo[101][101];
- for (int i=0;i<n;++i) for (int j=0;j<m;++j) mo[i][j]=0;
- for (int i=0;i<n;++i) for (int j=0;j<m;++j)
- {
- if (l[i][j]!='?') continue;
- for (int k=0;k<v.size();++k) if (v[k][i][j]!='*' && v[k][i][j]!='?') ++mo[i][j];
- }
- int mk=0,ml=0;
- for (int i=0;i<n;++i) for (int j=0;j<m;++j) if (mo[i][j]>mo[mk][ml])
- {
- mk=i;
- ml=j;
- }
- cout<<1<<endl<<mk<<' '<<ml<<" ."<<endl;
- continue;
- }
- cout<<conc.size()<<endl;
- for (auto x: conc)
- {
- cout<<x.first.first<<' '<<x.first.second<<' '<<x.second<<endl;
- h[x.first.first][x.first.second]=x.second;
- }
- //for (int i=0;i<n;++i) cout<<h[i]<<endl;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement