luogu Tweetuzki 愛伊圖
阿新 • • 發佈:2019-01-10
這題因為最多隻有十行,而每個數字有5行,我們只需列舉前n-4行,因為數字相互之間不會重合,所以只需找到左上角第一個"#",然後掃描3*5 的小矩陣 ,根據每個數字的小特徵,暴力標記就行
#include<iostream> #include<cstdio> #include<cmath> #include<algorithm> #define ll long long using namespace std; int r,c; char a[11][100001]; bool vis[100001]; int read() { int p=1; int x=0; char c=getchar(); while(c<'0'||c>'9') { if(c=='-') p=-1; c=getchar(); } while(c>='0'&&c<='9') { x=x*10+c-'0'; c=getchar(); } return x*p; } void write(int x) { if(x<0) { putchar('-'); x=-x; } if(x>9) write(x/10); putchar(x%10+'0'); } int ans=0; int b[1000001],num; int main() { r=read();c=read(); for(int i=1;i<=r;i++) for(int j=1;j<=c;j++) cin>>a[i][j]; for(int i=1;i<=c;i++) for(int j=1;j<=r;j++) { if(a[j][i]=='#'&&!vis[i]) { int sum=0; for(int k=0;k<5;k++) if(a[j+k][i]=='#'&&(a[j+k][i+1]=='.'||i+1>c)) sum++;//找1 if(sum==5) { b[++num]=1; vis[i]=1; continue; } } if(a[j][i]=='#'&&!vis[i]&&!vis[i+1]&&!vis[i+2]) { bool p=0; for(int k=0;k<3;k++) if(a[j][i+k]=='.')//找4 { b[++num]=4; vis[i]=1,vis[i+1]=1,vis[i+2]=1; p=1; continue; } if(p) continue; int sum=0; for(int k=0;k<5;k++) { if(a[j+k][i]=='.') sum++; } if(sum==4) { b[++num]=7; vis[i]=1,vis[i+1]=1,vis[i+2]=1;找7 continue; } else { if(sum==1) { if(a[j+1][i]=='.'&&a[j+3][i]=='#') { b[++num]=2; vis[i]=1,vis[i+1]=1,vis[i+2]=1;//找2 continue; } else { if(a[j+1][i+2]=='.') { b[++num]=5;//找5 } else b[++num]=9;//找九 vis[i]=1,vis[i+1]=1,vis[i+2]=1; continue; } } if(sum==2) { b[++num]=3;//找三 vis[i]=1,vis[i+1]=1,vis[i+2]=1; continue; } else { if(a[j+1][i+2]=='.') b[++num]=6;//找6 else if(a[j+1][i+2]=='#'&&a[j+2][i+1]=='#') b[++num]=8;//找8 else b[++num]=0;//找0 vis[i]=1,vis[i+1]=1,vis[i+2]=1; } } } } for(int i=1;i<=num;i++) cout<<b[i];//依次輸出 return 0; }