1 条题解

  • 0
    @ 2025-7-1 18:40:03

    bfs题。

    在bfs的过程中,应注意判重,可以状态压缩后用STL里的set来进行。

    由于只有25个方格,每个方格是否选中可用01表示这样可用二进制状压。

    所选的联通块不是一笔画出的,在搜的时候应从已选择的点向外扩展。

    注意及时剪枝。

    代码:

    #include <cstdio>
    #include <iostream>
    #include <algorithm>
    #include <cstring>
    #include <cstdlib>
    #include <map>
    #include <queue>
    #include <vector>
    #include <set>
    using namespace std;
    int dx[]={0,0,1,-1};
    int dy[]={-1,1,0,0};
    bool vis[10][10];
    int a[10][10];
    set<int> h;
    int ans=0;
    void dfs(int pos,int t,int s)
    {
    	if(t-s>=4)return;
    	if(h.count(pos))return;
    	h.insert(pos);
    	if(t==7){ans++;return;}
    	for(int x=1;x<=5;x++)
    	for(int y=1;y<=5;y++)
    	if(vis[x][y])
    	for(int i=0;i<4;i++)
    	{
    		if(x+dx[i]<=5&&x+dx[i]>=1&&y+dy[i]<=5&&y+dy[i]>=1&&vis[x+dx[i]][y+dy[i]]==0)
    		{
    			vis[x+dx[i]][y+dy[i]]=1;
    			if(a[x+dx[i]][y+dy[i]]==0)dfs((pos|(1<<((x+dx[i]-1)*5+y+dy[i]))),t+1,s+1);
    			else dfs((pos|(1<<((x+dx[i]-1)*5+y+dy[i]))),t+1,s);
    			vis[x+dx[i]][y+dy[i]]=0;
    		}
    	}
    }
    int main()
    {
    	ios::sync_with_stdio(0);cin.tie(0);
    	for(int i=1;i<=5;i++)
    	{
    		for(int j=1;j<=5;j++)
    		{
    			char c;
    			cin>>c;
    			if(c=='H')a[i][j]=1;
    			else a[i][j]=0;
    		}
    	}
    	for(int i=1;i<=5;i++)
    	{
    		for(int j=1;j<=5;j++)
    		{
    			memset(vis,0,sizeof(vis));
    			vis[i][j]=1;
    			if(a[i][j]==0)dfs((1<<((i-1)*5+j)),1,1);
    			else dfs((1<<((i-1)*5+j)),1,0);
    			vis[i][j]=0;
    		}
    	}
    	cout<<ans;
    	return 0;
    }
    
    • 1

    信息

    ID
    1458
    时间
    1000ms
    内存
    64MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者