0
点赞
收藏
分享

微信扫一扫

《最新出炉》系列初窥篇-Python+Playwright自动化测试-33-处理https 安全问题或者非信任站点-上篇

墨香子儿 2024-03-03 阅读 6

前言:

   今老师讲了了dfs,虽然我自己之前也自学了一点点,但我还是感觉做题并不是很顺,尤其是今天最后一题,我调试了一下午都没过,还需要积累经验呀。

正文:

Problem:A 白与黑-搜索:

#include <bits/stdc++.h>
using namespace std;
int n,m,sum,newx,newy;
string a[101];
int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
int dfs(int x,int y)
{
    a[x][y]='#';
    for(int i=0;i<4;i++)
    {
        newx=x+dir[i][0];
        newy=y+dir[i][1];
        if(newx>=0&&newx<m&&newy>=0&&newy<n&&a[newx][newy]!='#')
        sum++,dfs(newx,newy);
    }
   // for(int i=1;i<=9;i++){
	//	for(int o=1;o<=6;o++){
	//		cout<<a[i][o];
	//	}
	//	cout<<endl;
//	}
}
int main()
{
    while(cin>>n>>m&&n&&m)
    {
        for(int i=0;i<m;i++)
            cin>>a[i];
        sum=1;
        for(int i=0;i<m;i++)
            for(int j=0;j<n;j++)
                if(a[i][j]=='@')dfs(i,j);
        cout<<sum<<endl;
    }
    return 0;
}

这道题其实是很经典的红与黑问题,在@处开始dfs去搜寻全部可行点并切不需要回溯(不需要回复已标记点)。

Problem:B 迷宫寻路-搜索:

#include <bits/stdc++.h>
 
using namespace std;
 
int n,m;
int stx,sty,enx,eny;
string a[1005];
int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
 
void dfs(int x,int y)
{
    a[x][y]='#';
    for(int i=0;i<4;i++)
    {
        int newx=x+dir[i][0];
        int newy=y+dir[i][1];
        if(newx>=0 && newx<n && newy>=0 && newy<m && a[newx][newy]=='*')
        {
            dfs(newx,newy);
        }
    }
}
int main()
{
    while(scanf("%d%d",&n,&m)!=-1)
    {
        stx=sty=enx=eny=-1;
        for(int i=0;i<n;i++) cin>>a[i];
 
        for(int i=0;i<n;i++)
        for(int j=0;j<m;j++)
        {
            if((i==0 || i==n-1 || j==0 || j==m-1) && a[i][j]=='*')
            {
                if(stx==-1) stx=i,sty=j;
                else enx=i,eny=j;
            }
        }
        dfs(stx,sty);
        if(a[enx][eny]!='#') printf("NO\n");
        else printf("YES\n");
    }
}

找到两个边沿的起点在从一个出发开始dfs,标记所有搜到的点,最后看看另一个起点是否被标记即可。

Problem:C 猴群-搜索:

#include <bits/stdc++.h>
using namespace std;
int n,m;
int num;
string a[105];
int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
int dfs(int x,int y)
{
    a[x][y]='0';
    for(int i=0;i<n;i++)
    {
        int newx=x+dir[i][0];
        int newy=y+dir[i][1];
        if(newx>=0 && newx<n && newy>=0 && newy<m && a[newx][newy]!='0')
        {
            dfs(newx,newy);
        }
    }
}
int main()
{
    scanf("%d%d",&n,&m);
    num=0;
    for(int i=0;i<n;i++) cin>>a[i];
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<m;j++)
        {
            if(a[i][j]!='0')
            {
                num++;
                dfs(i,j);
            }
        }
    }
    printf("%d\n",num);
}

老师专门讲了这个题,我们只需从头遍历到尾去找非0值,找到后答案加1,并从该点出发搜寻相邻的全部非0值,将他们更新为0,在继续遍历即可。

Problem:D 01迷宫-搜索:

#include <bits/stdc++.h>
using namespace std;
char mp[1009][1009];
int n,m,fx,fy,tx,ty,cnt;
int book[1009][1009],ans[100009],dis[1009][1009];
int nx[4][2]={{1,0},{0,1},{-1,0},{0,-1}};
void dfs(int x,int y){
	//cout<<x<<" "<<y<<endl;
	book[x][y]=1;
	dis[x][y]=cnt;ans[cnt]++;
	for(int i=0;i<=3;i++){
		tx=x+nx[i][0];ty=y+nx[i][1];
		if(tx<1||tx>n||ty<1||ty>n||mp[tx][ty]==mp[x][y]||book[tx][ty]==1)continue;
		dfs(tx,ty);
	}
	//return;
}
int main(){
	ios::sync_with_stdio(false);
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		for(int o=1;o<=n;o++){
			cin>>mp[i][o];
		}
	}
	cnt=1;
	while(m--){
		cin>>fx>>fy;
		if(dis[fx][fy]==0){cnt++;dfs(fx,fy);cout<<ans[cnt]<<endl;
		else cout<<ans[dis[fx][fy]]<<endl;
		}
	return 0;
}

这题是洛谷的1141题,在 oj上更新过数据,我不知道老师加了个什么数据进去,反正我优化了一下午代码,洛谷上都过了,在林大oj上还是TLE,心态炸了。这题和以往题差不多,但为了优化时间我们在搜索时标记一下,下次搜索时就不用在找一次了,听说用记忆化搜索可以过,等我这几天去了解一下,之后看看能不能过。

后记:

   今天这个是开始训练以来最难以理解的一个算法了,不过之后肯定还有更加抽象的等着我,好好努力吧。

举报

相关推荐

0 条评论