比较麻烦的暴力搜索
题目链接一开始读错题了,以为abc可以出现多次,浪费了很多时间,一定要戒骄戒躁读好题!这种搜索题要思路打开,想一想以什么搜索按列去搜索,感觉自己写的有点麻烦了我的代码:
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 86 87 88
| #include<bits/stdc++.h> using namespace std; int n; string rr,cc; int r[10],c[10]; int cntr[10]; bool ise[10][10]; int mp[10][10]; bool flag=false; int ans=0; void out(){ cout<<"Yes"<<endl; for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ if(mp[i][j]==-1) cout<<"."; else cout<<(char)(mp[i][j]+'A'); } cout<<endl; }
} void dfs(int iofc){ if(flag) return; if(iofc==n+1){ flag=1; out(); } for(int i=1;i<=n-2;i++){ int x=c[iofc],y=(c[iofc]+1)%3,z=(c[iofc]+2)%3; if(ise[i][x]) continue; if(cntr[i]==0&&x!=r[i]) continue; ise[i][c[iofc]]=1; mp[i][iofc]=c[iofc]; cntr[i]++; for(int j=i+1;j<=n-1;j++){ if(ise[j][y]) continue; if(cntr[j]==0&&y!=r[j]) continue; ise[j][y]=1; mp[j][iofc]=y; cntr[j]++; for(int k=j+1;k<=n;k++){ if(ise[k][z]) continue; if(cntr[k]==0&&z!=r[k]) continue; ise[k][z]=1; mp[k][iofc]=z; cntr[k]++; dfs(iofc+1); ise[k][z]=0; mp[k][iofc]=-1; cntr[k]--; } ise[j][y]=0; mp[j][iofc]=-1; cntr[j]--; } z=(c[iofc]+1)%3;y=(c[iofc]+2)%3; for(int j=i+1;j<=n-1;j++){ if(ise[j][y]) continue; if(cntr[j]==0&&y!=r[j]) continue; ise[j][y]=1; mp[j][iofc]=y; cntr[j]++; for(int k=j+1;k<=n;k++){ if(ise[k][z]) continue; if(cntr[k]==0&&z!=r[k]) continue; ise[k][z]=1; mp[k][iofc]=z; cntr[k]++; dfs(iofc+1); ise[k][z]=0; mp[k][iofc]=-1; cntr[k]--; } ise[j][y]=0; mp[j][iofc]=-1; cntr[j]--; } ise[i][x]=0; mp[i][iofc]=-1; cntr[i]--; } }
int main(){ ios::sync_with_stdio(0); cout.tie(0); cin>>n; cin>>rr>>cc; for(int i=1;i<=n;i++) r[i]=rr[i-1]-'A'; for(int i=1;i<=n;i++) c[i]=cc[i-1]-'A'; memset(mp,-1,sizeof(mp)); memset(cntr,0,sizeof(cntr)); dfs(1); if(!flag) cout<<"No"; return 0; }
|