「CF516B」Drazil and Tiles
题解
无脑爆搜会T。。。
正解拓扑排序。。。然后就不用说了吧。。
爆搜
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
#include<iostream> #include<cstring> #include<cstdio> #include<cstdlib> #include<cmath> #include<algorithm> #define ll long long #define inf 1000000000 #define dfsnxt(x,y) y==m?dfs(x+1,1):dfs(x,y+1) using namespace std; int read() { int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } int n,m,flag; char a[2005][2005],b[2005][2005]; bool s1(int i,int j) { if(a[i+1][j]=='.'&&i+1<=n) {a[i][j]='^',a[i+1][j]='v';return 1;} return 0; } bool s2(int i,int j) { if(a[i][j+1]=='.'&&j+1<=m) {a[i][j]='<',a[i][j+1]='>';return 1;} return 0; } void dfs(int x,int y) { if(flag==2)return; if(x==n+1) { if(!flag) { for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) b[i][j]=a[i][j]; flag=1; } else flag=2; return; } if(a[x][y]!='.') { dfsnxt(x,y); return; } if(s1(x,y)) { dfsnxt(x,y); a[x][y]=a[x+1][y]='.'; } if(s2(x,y)) { dfsnxt(x,y); a[x][y]=a[x][y+1]='.'; } } int main() { n=read();m=read(); for(int i=1;i<=n;i++) scanf("%s",a[i]+1); dfs(1,1); if(flag!=1)puts("Not unique"); else for(int i=1;i<=n;i++) printf("%s\n",b[i]+1); return 0; } |
拓扑排序
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 |
#include<iostream> #include<cstring> #include<cstdio> #include<cstdlib> #include<cmath> #include<algorithm> #define ll long long #define inf 1000000000 using namespace std; int read() { int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } int n,m; int d[2005][2005]; int qx[4000005],qy[4000005],top; char ch[2005][2005]; int xx[4]={1,-1,0,0},yy[4]={0,0,1,-1}; void update(int nx,int ny) { for(int i=0;i<4;i++) { int x=nx+xx[i],y=ny+yy[i]; if(ch[x][y]!='.'||x<1||y<1||x>n||y>m)continue; d[x][y]--; if(d[x][y]==1) { top++; qx[top]=x;qy[top]=y; } } } void solve() { for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) if(ch[i][j]=='.') for(int k=0;k<4;k++) { int x=i+xx[k],y=j+yy[k]; if(ch[x][y]!='.'||x<1||y<1||x>n||y>m)continue; d[i][j]++; } for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) if(d[i][j]==1) { top++;qx[top]=i;qy[top]=j; } while(top) { int nx=qx[top],ny=qy[top];top--; for(int k=0;k<4;k++) { int x=nx+xx[k],y=ny+yy[k]; if(ch[x][y]!='.'||x<1||y<1||x>n||y>m)continue; if(k==0)ch[nx][ny]='^',ch[x][y]='v'; if(k==1)ch[nx][ny]='v',ch[x][y]='^'; if(k==2)ch[nx][ny]='<',ch[x][y]='>'; if(k==3)ch[nx][ny]='>',ch[x][y]='<'; d[nx][ny]=d[x][y]=0; update(x,y); } } } int main() { n=read();m=read(); for(int i=1;i<=n;i++) scanf("%s",ch[i]+1); solve(); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) if(ch[i][j]=='.') { puts("Not unique"); return 0; } for(int i=1;i<=n;i++) printf("%s\n",ch[i]+1); return 0; } |
Subscribe