2 solutions
-
3
构图写法,并不建议因为太费时间
Accpeted
#include using namespace std; char a[105][105]; bool vis[105][105]; int at[55][55]; int n,m; int mx=-1,ans=0; int dx[]={-1,0,1,0}, dy[]={0,1,0,-1}; struct node{ int x,y; }; queue<node> q; void init() { for(int i=0;i<=104;i++) { for(int j=0;j<=104;j++) { if(i%2==0&&j%2==0) { a[i][j]='#'; } else a[i][j]='.'; } } for(int i=0;i<=2*m+1;i++) { a[0][i]='#'; a[2*n][i]='#'; } for(int i=0;i<=2*n+1;i++) { a[i][0]='#'; a[i][2*m]='#'; } } void jnmbm_gnmbt(int x,int i,int j) { int t=x; a[2*i-1][2*j-1]='&'; bool e=false,s=false,w=false,n=false; while(t>0) { if(t>=8) { t-=8; s=true; } else if(t>=4) { t-=4; e=true; } else if(t>=2) { t-=2; n=true; } else if(t>=1) { t-=1; w=true; } } if(s&&a[2*i][2*j-1]=='.') a[2*i][2*j-1]='#'; if(e&&a[2*i-1][2*j]=='.') a[2*i-1][2*j]='#'; if(n&&a[2*i-2][2*j-1]=='.') a[2*i-2][2*j-1]='#'; if(w&&a[2*i-1][2*j-2]=='.') a[2*i-1][2*j-2]='#'; } void buc() { for(int i=0;i<=2*n;i++) { for(int j=0;j<=2*m;j++) { if(a[i][j]=='.') a[i][j]='^'; } } } int main() { cin>>n>>m; init(); for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { cin>>at[i][j]; jnmbm_gnmbt(at[i][j],i,j); } } buc(); // for(int i=0;i<=2*n;i++) // { // for(int j=0;j<=2*m;j++) // { // cout<<a[i][j]; // } // cout<<endl; // } // cout<<endl; for(int i=1;i<=2*n;i++) { for(int j=1;j<=2*m;j++) { if(a[i][j]!='#'&&!vis[i][j]) { int mxt=1; vis[i][j]=true; q.push({i,j}); while(!q.empty()) { node t=q.front(); q.pop(); for(int i=0;i<4;i++) { int xx=t.x+dx[i],yy=t.y+dy[i]; if(!vis[xx][yy]&&a[xx][yy]!='#') { vis[xx][yy]=true; q.push({xx,yy}); if(a[xx][yy]=='&') { mxt++; } } } } ans++; if(mx<mxt) mx=mxt; } } } cout<<ans<<endl<<mx; return 0; }
-
2
思路
bitset了解一下
将数字转为二进制
我们可以看成只有东面是打通的墙
对应关系:
- 南墙 -- 1
- 东墙 -- 0 -- 打通的墙
- 北墙 -- 1
- 西墙 -- 1
代码
本题难在墙壁的位置
#include<iostream> #include<bitset> using namespace std; int n,m,ans=0,ma=0,ti=0; int a[114][114];//迷宫 int vis[114][114];//标记数组 int xl[4]={0,-1,0,1};//方位数组 int yl[4]={-1,0,1,0};//方位数组 void dfs(int x,int y) { if(vis[x][y])//标记过就返回,不再探索 { return; } vis[x][y]=1;//标记 ti++;//增加格数 bitset<4>bs=a[x][y];//核心代码 for(int i=0;i<4;i++) { int xs=x+xl[i],ys=y+yl[i]; if(xs>=0 && xs<n && ys>=0 && ys<m && (!vis[xs][ys]) && !(bs[i]))//判断注意 { dfs(xs,ys);//递归 } } } int main() { cin>>n>>m;//输入 for(int i=0;i<n;i++) { for(int j=0;j<m;j++) { cin>>a[i][j];//输入 vis[i][j]=0;//多余,但只是为了初始化 } } for(int i=0;i<n;i++) { for(int j=0;j<m;j++) { if(!vis[i][j])//没有标记过时 { ti=0;//重置 dfs(i,j);//递归 ma=max(ma,ti);//最大的房间格数 ans++;//增加房间数 } } } cout<<ans<<endl<<ma;//输出 return 0;//完结散花 }
- 1
Information
- ID
- 735
- Time
- 1000ms
- Memory
- 256MiB
- Difficulty
- 4
- Tags
- # Submissions
- 47
- Accepted
- 23
- Uploaded By