2 solutions

  • 3
    @ 2024-1-26 11:12:10

    构图写法,并不建议因为太费时间

    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
      @ 2024-4-17 14:00:25

      思路

      bitset了解一下

      OI wiki-bitset

      将数字转为二进制

      11(10)1011(2)11(10)\rightarrow1011(2)我们可以看成只有东面是打通的墙

      对应关系:

      • 南墙 -- 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