菜鸟系列——简单搜索

ODOO18菜鸟二次开发系列(2)-去除过多的odoo元素 十年前尝试用 Odoo 搭建项目管理平台未果,如今借助 DeepSeek 等工具,基于 Odoo 18 版本完成了系统定制。通过创建自定义模块移除了底部版权信息,修改前端代码重构用户菜单(删除 Odoo 文档并添加公司官网链接),还重命名了默认机器人。尽管替换链接中的 "odoo" 标识时出现兼容性问题,但整体开发过程因新版本逻辑更清晰、社区资源丰富而大幅简化。最终成功打造出符合企业需求的轻量级管理系统,为后续开发积累了可复用的经验。 阅读详情
菜鸟就要老老实实重新学起:

简单搜索:

一些简单搜索题,其中一些源自kuangbin大神的题目列表,留下以后出题用。

eg:

POJ1321 棋盘问题

http://poj.org/problem?id=1321

题意:
在一个棋盘内放k个棋子,每一行每一列都最多只能有一个棋子,求方法数,‘#’为可放的地方。
思路:
直接暴力深搜枚举所有情况即可,每一行选择一个点向下继续深搜,同时a[]储存该列是否已有棋子。
code:
#define N 11

int n,m;
int flag,sum,ave,ans,res,len,ans1,ans2;
int a[N];
int g[N][N];
char s[101];
void dfs(int now,int step)
{
    if(step==m)
    {
        sum++;
        return;
    }
    if(now==n)
        return;
    for(int i=0;i<n;i++)
        if(g[now][i]&&!a[i])
        {
            a[i]=1;
            dfs(now+1,step+1);
            a[i]=0;
        }
    dfs(now+1,step);
}
int main()
{
    int i,j,k,kk,t,x,y,z;
    while(scanf("%d%d",&n,&m)!=EOF&&n!=-1)
    {
        memset(g,0,sizeof(g));
        memset(a,0,sizeof(a));
        for(i=0;i<n;i++)
        {
            scanf("%s",s);
            x=strlen(s);
            for(j=0;j<x;j++)
                if(s[j]=='#')
                    g[i][j]=1;
        }
        sum=0;
        dfs(0,0);
        printf("%d\n",sum);
    }
    return 0;
}

POJ2251 Dungeon Master

http://poj.org/problem?id=2251

题意:
三维空间,求从S点到E点的最小距离。
思路:
简单bfs搜索,从起点开始压入队列逐渐广搜开直到找到E或者队列为空,注意标记走过的位置。
code:
#define N 112

int n,m,r,xx,yy,zz;
int flag,sum,ave,ans,res,len,ans1,ans2;
int g[N][N][N];
int dir[6][3]={1,0,0,-1,0,0,0,1,0,0,-1,0,0,0,1,0,0,-1};
char s[N];
struct node
{
    int x,y,z,step;
}tn;
int bfs(int x,int y,int z)
{
    queue<node> q;
    while(!q.empty())q.pop();
    node a,b;
    a.x=x;a.y=y;a.z=z;a.step=0;
    q.push(a);
    while(!q.empty())
    {
        a=q.front();q.pop();
        if(a.x==xx&&a.y==yy&&a.z==zz)
            return a.step;
        for(int i=0;i<6;i++)
        {
            b.x=a.x+dir[i][0];b.y=a.y+dir[i][1];b.z=a.z+dir[i][2];
            if(b.x>=n||b.x<0||b.y>=m||b.y<0||b.z>=r||b.z<0)
                continue;
            if(g[b.z][b.x][b.y])
            {
                g[b.z][b.x][b.y]=0;
                b.step=a.step+1;
                q.push(b);
            }
        }
    }
    return -1;
}
int main()
{
    int i,j,k,kk,t,x,y,z;
    while(scanf("%d%d%d",&r,&n,&m)!=EOF&&n)
    {
        memset(g,0,sizeof(g));
        for(k=0;k<r;k++)
            for(i=0;i<n;i++)
            {
                scanf("%s",s);
                int len=strlen(s);
                for(j=0;j<len;j++)
                {
                    if(s[j]=='#')
                        continue;
                    g[k][i][j]=1;
                    if(s[j]=='S')
                        x=i,y=j,z=k;
                    if(s[j]=='E')
                        xx=i,yy=j,zz=k;
                }
            }
        t=bfs(x,y,z);
        if(t==-1)
            printf("Trapped!\n");
        else
            printf("Escaped in %d minute(s).\n",t);
    }
    return 0;
}

POJ3278 Catch That Cow

http://poj.org/problem?id=3278

题意:
求从第一个数变换到第二个数的最小步骤,数字每一步都可以加减1或者扩大2倍。
思路:
暴力bfs搜索,状态有加一、减一、乘二,三种。
code:
#define N 212345

int n,m;
int flag,sum,ave,ans,res,len,ans1,ans2;
bool vis[N];
struct node
{
    int x,y;
}tn;
int main()
{
    queue<node> q;
    node g,h;
    int i,j,k,kk,t,x,y,z;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        while(!q.empty())q.pop();
        memset(vis,false,sizeof(vis));
        g.x=n;g.y=0;vis[n]=true;
        res=INF;
        q.push(g);
        while(res==INF&&!q.empty())
        {
            g=q.front();q.pop();
            if(g.x==m)res=g.y;
            h.x=g.x+1;h.y=g.y+1;
            if(h.x<N&&!vis[h.x])
                vis[h.x]=true,q.push(h);
            h.x=g.x-1;
            if(h.x>=0&&!vis[h.x])
                vis[h.x]=true,q.push(h);
            h.x=g.x*2;
            if(h.x<N&&!vis[h.x])
                vis[h.x]=true,q.push(h);
        }
        printf("%d\n",res);
    }
    return 0;
}

POJ3279 Fliptile

http://poj.org/problem?id=3279

题意:
给出一些板子的正反状态,一头牛踩这些板子,每次踩下去之后被踩的板子和周围的四个都会翻转,求一种踩板子的方式能够使得所有板子都‘0’朝上。
思路:

暴力枚举第一行的所有可能方案,之后向下搜索得出该方案是否可行。

因为每次变换的都是一个十字形区域,所以枚举得出第一行的状态后,可以得出当前第一行每个板子的状态,由此可以决定第二行对应板子的状态,由此不断向下搜索直到最后一行时判断是否都为0。第一行的枚举可以用状态压缩。

code:
#define N 20

int n,m;
int flag,sum,ave,res,len,ans1,ans2;
int f[N][N];
int ans[N][N];
int g[N][N];
bool mark(int x,int y)
{
    return f[x-1][y]^f[x+1][y]^f[x][y-1]^f[x][y+1]^f[x][y]^g[x][y];
}
int main()
{
    int i,j,k,kk,t,x,y,z;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        memset(g,0,sizeof(g));
        for(i=1;i<=n;i++)
            for(j=1;j<=m;j++)
                scanf("%d",&g[i][j]);
        for(k=0;k<(1<<m);k++)
        {
            memset(f,0,sizeof(f));
            for(i=1;i<=m;i++)
                f[1][i]=k&(1<<(i-1))?1:0;
            for(i=1;i<n;i++)
                for(j=1;j<=m;j++)
                        f[i+1][j]=mark(i,j)?1:0;
            flag=1;
            for(i=1;i<=m;i++)
                if(mark(n,i))
                    flag=0;
            if(flag)
                break;
        }
        if(!flag)
        {
            printf("IMPOSSIBLE\n");
            continue;
        }
        for(i=1;i<=n;i++)
        {
            for(j=1;j<=m;j++)
                printf("%d ",f[i][j]);
            printf("\n");
        }
    }
    return 0;
}

POJ1426 Find The Multiple

http://poj.org/problem?id=1426

题意:
寻找一个只包含1和0的十进制数是n的倍数。
思路:
因为这个倍数的每一位都只有1或0两种状态,所以可以从首位开始向后bfs每种状态展开成末尾加1或0两种状态,直到得出结果。
code:
#define N 1123

int n,m;
int flag,sum,ave,ans,res,len,ans1,ans2;
bool vis[N];
struct node
{
    int now;
    string s;
}tn;
int main()
{
    int i,j,k,kk,t,x,y,z;
    queue<node> q;
    node a,b,c;
    while(scanf("%d",&n)!=EOF&&n)
    {
        while(!q.empty())q.pop();
        memset(vis,false,sizeof(vis));
        a.now=1;a.s="1";vis[1]=true;
        q.push(a);
        while(!q.empty())
        {
            a=q.front();q.pop();
            b.s=a.s+"1";c.s=a.s+"0";
            b.now=(a.now*10+1)%n;c.now=(a.now*10)%n;
            if(!b.now)
            {
                cout<<b.s<<endl;
                break;
            }
            if(!c.now)
            {
                cout<<c.s<<endl;
                break;
            }
            if(!vis[b.now])
            {
                vis[b.now]=true;
                q.push(b);
            }
            if(!vis[c.now])
            {
                vis[c.now]=true;
                q.push(c);
            }
        }
    }
    return 0;
}

POJ3126 Prime Path

http://poj.org/problem?id=3126

题意:
要求从第一个四位数变成第二个四位数字,每次只能改变某一位的数字,且每次改变之后的四位数必须是质数,求最少变换步骤,
思路:
只有四位数而且求最少,直接暴力BFS,筛素数打表出四位数的所有素数判断,之后从第一个数字开始bfs,每次展开成4种状态,改变其中一位,同时判断是否为素数,直到得出结果。
code:
#define N 11234

int n,m;
int flag,sum,ave,ans,res,len,ans1,ans2;
bool vis[N];
struct node
{
    int x,y,z;
}tn;
bool mark[N];
int pri[N],cnt;
void SP()
{
    cnt=0;
    memset(mark,true,sizeof(mark));
    mark[0]=mark[1]=false;
    for(int i=2;i<N;i++)
    {
        if(mark[i])
            pri[cnt++]=i;
        for (int j=0;(j<cnt)&&(i*pri[j]<N);j++)
        {
            mark[i*pri[j]]=false;
            if (i%pri[j]==0)
                break;
        }
    }
}
int main()
{
    int i,j,k,kk,t,x,y,z,w,now;
    SP();
    scanf("%d",&k);
    while(k--)
    {
        scanf("%d %d",&n,&m);
        memset(vis,false,sizeof(vis));
        queue<node> q;
        while(!q.empty())q.pop();
        node g,h;
        g.x=n;g.y=0;
        q.push(g);
        flag=0;
        vis[n]=true;
        while(!q.empty())
        {
            g=q.front();q.pop();
            if(g.x==m)
            {
                flag=1;
                res=g.y;
                break;
            }
            x=g.x/1000;y=g.x/100%10;z=g.x/10%10;w=g.x%10;
            t=g.x-x*1000;
            for(i=1;i<=9;i++)
            {
                now=t+i*1000;
                if(now!=g.x&&!vis[now]&&mark[now])
                {
                    vis[now]=true;
                    h.x=now;h.y=g.y+1;h.z=g.x;
                    q.push(h);
                }
            }
            t=g.x-y*100;
            for(i=0;i<=9;i++)
            {
                now=t+i*100;
                if(now!=g.x&&!vis[now]&&mark[now])
                {
                    vis[now]=true;
                    h.x=now;h.y=g.y+1;h.z=g.x;
                    q.push(h);
                }
            }
            t=g.x-z*10;
            for(i=0;i<=9;i++)
            {
                now=t+i*10;
                if(now!=g.x&&!vis[now]&&mark[now])
                {
                    vis[now]=true;
                    h.x=now;h.y=g.y+1;h.z=g.x;
                    q.push(h);
                }
            }
            t=g.x-w;
            for(i=0;i<=9;i++)
            {
                now=t+i;
                if(now!=g.x&&!vis[now]&&mark[now])
                {
                    vis[now]=true;
                    h.x=now;h.y=g.y+1;h.z=g.x;
                    q.push(h);
                }
            }
        }
        if(flag)
            printf("%d\n",res);
        else
            printf("Impossible\n");
    }
    return 0;
}

POJ3087 Shuffle'm Up

http://poj.org/problem?id=3087

题意:
有两摞牌,现在要求通过特定的洗牌方式得到要求的序列,洗牌时只能将两摞牌交叉在一起,第一摞的第一张在最上面,然后上面一半为新的第一裸,下面一半为新的后一半,求洗出要求序列的次数。
思路:
其实是简单模拟题,那为什么在搜索题列表里,,,其实我也不知道什么情况(逃···

就是模拟洗牌就行了,只要记录每次的序列,出现相同序列则无解,map或者set或者hash或者手写字典树等等,方法很多啦,

code:
#define N 512

int n,m;
int flag,sum,ave,ans,res,len,ans1,ans2;
int main()
{
    int i,j,k,kk,t,x,y,z;
    #ifndef ONLINE_JUDGE
        freopen("test.txt","r",stdin);
    #endif
    map<string,bool> mp;
    string s,ss,s1,s2;
    cin>>k;
    kk=0;
    while(k--)
    {
        mp.clear();
        scanf("%d",&n);
        cin>>s1>>s2>>ss;
        s=ss;
        mp[ss]=true;
        sum=0;
        while(1)
        {
            sum++;
            for(j=0,i=0;i<n;i++)
                s[j++]=s2[i],s[j++]=s1[i];
            if(s==ss)
            {
                printf("%d %d\n",++kk,sum);
                break;
            }
            if(mp[s])
            {
                printf("%d -1\n",++kk);
                break;
            }
            mp[s]=true;
            s1.assign(s,0,n);s2.assign(s,n,n);
        }
    }
    return 0;
}

FZU2150 Fire Game

http://poj.org/problem?id=3984http://acm.fzu.edu.cn/problem.php?pid=2150

题意:
两个熊孩子防火烧草堆,#代表草堆,点燃的草堆会在下一秒点燃周围上下左右的其他草堆,求所有草堆被烧完的最少时间,两个熊孩子不能烧完所有草堆输出-1.
思路:
所有草堆分块,超过2个块则不能烧完,一开始想错,用了两次BFS第一次找到每个块最远的那个点,然后bfs从那个点扫回来找到最长路径,从而求出烧这些草堆的最小时间,但是当只有一块草堆时,两个起点并不确定,一开始以为直接把最长路分4段从中间两点开始就行,但是最长路外的次长路并不一定多长,所以这种解法错误。

那么就只能暴力枚举所有的两个点的组合,bfs求出这两个点开始烧的时间,每一次都bfs依然会超时,可以提前以每一个点为起点bfs一次,确定当前起点时其他点被烧到的时间,然后枚举两点,直接得出所有其他点被烧到时间为这两点烧过去的最小值。

这题要敢于暴力枚举所有的两点组合,并且扫所有点,也就是有6层循环,同注意记录。

code:
#define N 15

int n,m;
int flag,sum,ave,ans,len,ans1,ans2;
int g[N][N];
int res[N][N][N][N];
int dir[4][2]={0,1,0,-1,1,0,-1,0};
bool vis[N][N];
char s[101];
struct node
{
    int x,y;
    int now;
}tn;
void bfs(int x,int y,int xx,int yy)
{
    queue<node>q;
    while(!q.empty())q.pop();
    node a,b;
    memset(vis,false,sizeof(vis));
    a.x=xx;a.y=yy;a.now=0;
    res[x][y][xx][yy]=0;
    q.push(a);
    vis[xx][yy]=true;
    while(!q.empty())
    {
        a=q.front();q.pop();
        for(int i=0;i<4;i++)
        {
            b=a;
            b.x+=dir[i][0];b.y+=dir[i][1];
            if(g[b.x][b.y]&&!vis[b.x][b.y])
            {
                vis[b.x][b.y]=true;
                b.now=a.now+1;
                res[x][y][b.x][b.y]=b.now;
                q.push(b);
            }
        }
    }
}
int main()
{
    int i,j,k,kk,t,x,xx,y,yy,z;
    scanf("%d",&k);
    kk=0;
    while(k--)
    {
        scanf("%d%d",&n,&m);
        memset(g,0,sizeof(g));
        for(i=1;i<=n;i++)
        {
            scanf("%s",s);
            for(j=1;j<=m;j++)
                if(s[j-1]=='#')
                    g[i][j]=1,ave++;
        }
        memset(res,0x3f,sizeof(res));
        for(i=1;i<=n;i++)
            for(j=1;j<=m;j++)
                if(g[i][j])
                    bfs(i,j,i,j);
        sum=INF;
        for(i=1;i<=n;i++)
            for(j=1;j<=m;j++)
                if(g[i][j])
                    for(int ii=1;ii<=n;ii++)
                        for(int jj=1;jj<=m;jj++)
                            if(g[i][j]&&g[ii][jj])
                            {
                                ans=0;
                                for(int iii=1;iii<=n;iii++)
                                    for(int jjj=1;jjj<=m;jjj++)
                                        if(g[iii][jjj])
                                            ans=max(ans,min(res[i][j][iii][jjj],res[ii][jj][iii][jjj]));
                                sum=min(sum,ans);
                            }
        printf("Case %d: ",++kk);
        if(sum==INF)
            printf("-1\n");
        else
            printf("%d\n",sum);
    }
    return 0;
}

POJ3414 Pots

http://poj.org/problem?id=3414

题意:
有两个已知容量的杯子,要通过他们倒出c升水。
思路:
常见的智力题,编程实现,每次只有6种情况,倒满1、倒满2、倒掉1,倒掉2,1倒给2,2倒给1,所以直接暴力bfs找结果就行了,代码有点挫,状态少习惯直接全写出来了,没错我就是懒的写个循环,,,
code:
#define N 112345

int n,m;
int flag,sum,ave,ans,res,len,ans1,ans2,cnt;
bool vis[N];
char s[1000];
struct node
{
    int now,x,y;
    vector<int> s;
}tn;
node bfs()
{
    queue<node>q;
    while(!q.empty())q.pop();
    node a,b; int t;
    a.x=0;a.y=0;
    a.now=0;a.s.clear();
    vis[0]=true;
    q.push(a);
    while(!q.empty())
    {
        a=q.front();q.pop();
        if(a.x==res||a.y==res)
            return a;
        b=a;
        b.x=n;b.now++;b.s.push_back(1);
        if(!vis[b.x*1000+b.y]){vis[b.x*1000+b.y]=true;q.push(b);}
        b=a;
        b.y=m;b.now++;b.s.push_back(2);
        if(!vis[b.x*1000+b.y]){vis[b.x*1000+b.y]=true;q.push(b);}
        b=a;
        b.x=0;b.now++;b.s.push_back(3);
        if(!vis[b.x*1000+b.y]){vis[b.x*1000+b.y]=true;q.push(b);}
        b=a;
        b.y=0;b.now++;b.s.push_back(4);
        if(!vis[b.x*1000+b.y]){vis[b.x*1000+b.y]=true;q.push(b);}
        b=a;
        t=min(b.x+b.y,m);b.x=max(b.x+b.y-m,0);b.y=t;
        b.now++;b.s.push_back(5);
        if(!vis[b.x*1000+b.y]){vis[b.x*1000+b.y]=true;q.push(b);}
        b=a;
        t=min(b.x+b.y,n);b.y=max(b.x+b.y-n,0);b.x=t;
        b.now++;b.s.push_back(6);
        if(!vis[b.x*1000+b.y]){vis[b.x*1000+b.y]=true;q.push(b);}
    }
    a.now=-1;
    return a;
}
int main()
{
    int i,j,k,kk,t,x,y,z;
    while(scanf("%d%d%d",&n,&m,&res)!=EOF&&n)
    {
        memset(vis,false,sizeof(vis));
        tn=bfs();
        if(tn.now==-1)
            printf("impossible\n");
        else
        {
            printf("%d\n",tn.now);
            for(i=0;i<tn.now;i++)
            {
                if(tn.s[i]==1)
                    printf("FILL(1)\n");
                if(tn.s[i]==2)
                    printf("FILL(2)\n");
                if(tn.s[i]==3)
                    printf("DROP(1)\n");
                if(tn.s[i]==4)
                    printf("DROP(2)\n");
                if(tn.s[i]==5)
                    printf("POUR(1,2)\n");
                if(tn.s[i]==6)
                    printf("POUR(2,1)\n");
            }
        }
    }
    return 0;
}


POJ3984 迷宫问题

http://poj.org/problem?id=3984
题意:
给出一个5*5的0/1阵,0为可走,求从左上角到右下角的最短路径,
思路:
BFS入门,可以回溯记录路径,但是为了方便直接写结构体里了。
code:

#define N 15

int n,m;
int flag,sum,ave,ans,len,ans1,ans2;
#define N 11

int n,m;
int flag,sum,ave,ans,res,len,ans1,ans2;
int g[N][N];
int dir[4][2]={0,1,0,-1,1,0,-1,0};
bool vis[N][N];
struct node
{
    int x,y,now;
    vector<int> s;
}tn;
node bfs(int x,int y)
{
    queue<node> q;
    while(!q.empty())q.pop();
    node a,b;
    a.x=x;a.y=y;a.now=1;a.s.clear();a.s.push_back(0);
    q.push(a);
    vis[x][y]=true;
    while(!q.empty())
    {
        a=q.front();q.pop();
        if(a.x==5&&a.y==5)
            return a;
        for(int i=0;i<4;i++)
        {
            b=a;
            b.x+=dir[i][0];b.y+=dir[i][1];
            if(!vis[b.x][b.y]&&g[b.x][b.y])
            {
                vis[b.x][b.y]=true;
                b.now=a.now+1;b.s.push_back((b.x-1)*10+(b.y-1));
                q.push(b);
            }
        }
    }
}
int main()
{
    int i,j,k,kk,t,x,y,z;
    memset(g,0,sizeof(0));
    for(i=1;i<=5;i++)
        for(j=1;j<=5;j++)
        {
            scanf("%d",&t);
            g[i][j]=t?0:1;
        }
    memset(vis,false,sizeof(vis));
    tn=bfs(1,1);
    for(i=0;i<tn.now;i++)
        printf("(%d, %d)\n",tn.s[i]/10,tn.s[i]%10);
    return 0;
}

UVA11624 Fire!

https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2671
题意:
着火了,J要跑出这个房间,#是墙,F是火,火每秒点着周围的格子,求J跑出房间的最短时间。
思路:
bfs两次,先将所有火的位置入队列,求出所有位置被火烧到的最短时间,然后bfsJ的所有逃跑路线找到在火烧到前的一条路线即可。
code:
#define N 1123

int n,m;
int flag,sum,ave,ans,res,len,ans1,ans2;
int xx[N],yy[N];
int f[N][N];
int g[N][N];
int dir[4][2]={0,1,0,-1,1,0,-1,0};
bool vis[N][N];
char s[101];
struct node
{
    int x,y;
    int now;
}tn;
bool in(int x,int y)
{
    return x<=n&&x>0&&y<=m&&y>0;
}
void bfsf()
{
    queue<node>q;
    while(!q.empty())q.pop();
    node a,b;
    memset(vis,false,sizeof(vis));
    for(int i=0;i<sum;i++)
    {
        a.x=xx[i];a.y=yy[i];a.now=0;
        q.push(a);
        vis[a.x][b.y]=true;
    }
    while(!q.empty())
    {
        a=q.front();q.pop();
        for(int i=0;i<4;i++)
        {
            b=a;
            b.x=a.x+dir[i][0];b.y=a.y+dir[i][1];b.now=a.now+1;
            if(!g[b.x][b.y]&&in(b.x,b.y)&&!vis[b.x][b.y])
            {
                f[b.x][b.y]=b.now;
                vis[b.x][b.y]=true;
                q.push(b);
            }
        }
    }
}
int bfsj(int x,int y)
{
    queue<node>q;
    while(!q.empty())q.pop();
    node a,b;
    memset(vis,false,sizeof(vis));
    a.x=x;a.y=y;a.now=0;
    q.push(a);
    vis[x][y]=true;
    while(!q.empty())
    {
        a=q.front();q.pop();
        for(int i=0;i<4;i++)
        {
            b=a;
            b.x=a.x+dir[i][0];b.y=a.y+dir[i][1];b.now=a.now+1;
            if(!g[b.x][b.y]&&!vis[b.x][b.y]&&b.now<f[b.x][b.y])
            {
                if(!in(b.x,b.y))
                    return b.now;
                vis[b.x][b.y]=true;
                q.push(b);
            }
        }
    }
    return -1;
}
int main()
{
    int i,j,k,kk,t,x,y,z;
    scanf("%d",&k);
    while(k--)
    {
        scanf("%d%d",&n,&m);
        memset(g,0,sizeof(g));
        memset(f,0x3f,sizeof(f));
        sum=0;
        for(i=1;i<=n;i++)
        {
            scanf("%s",s);
            for(j=1;j<=m;j++)
            {
                if(s[j-1]=='.')
                    continue;
                g[i][j]=1;
                if(s[j-1]=='J')
                    x=i,y=j;
                if(s[j-1]=='F')
                    xx[sum]=i,yy[sum++]=j;
            }
        }
        bfsf();
        t=bfsj(x,y);
        if(t==-1)
            printf("IMPOSSIBLE\n");
        else
            printf("%d\n",t);
    }
    return 0;
}

HDU1241 Oil Deposits

http://acm.hdu.edu.cn/showproblem.php?pid=1241
题意:
有很多@油井,周围一圈内可以连接在一起的油井在同一个油田中,求有多少油田。
思路:
bfs8个方向暴力即可。
code:
<pre name="code" class="cpp">#define N 112

int n,m;
int flag,sum,ave,ans,res,len,ans1,ans2;
int g[N][N];
int dir[8][2]={1,0,1,1,1,-1,0,1,0,-1,-1,0,-1,-1,-1,1};
char s[101];
struct node
{
    int x,y;
}tn;
void bfs(int x,int y)
{
    queue<node>q;
    while(!q.empty())q.pop();
    node a,b;
    a.x=x;a.y=y;
    q.push(a);
    while(!q.empty())
    {
        a=q.front();q.pop();
        for(int i=0;i<8;i++)
        {
            b.x=a.x+dir[i][0];b.y=a.y+dir[i][1];
            if(g[b.x][b.y])
                q.push(b);
            g[b.x][b.y]=0;
        }
    }
}
int main()
{
    int i,j,k,kk,t,x,y,z;
    while(scanf("%d%d",&n,&m)!=EOF&&n)
    {
        memset(g,0,sizeof(g));
        for(i=1;i<=n;i++)
        {
            scanf("%s",s);
            for(j=1;j<=m;j++)
                if(s[j-1]=='@')
                    g[i][j]=1;
        }
        sum=0;
        for(i=1;i<=n;i++)
            for(j=1;j<=m;j++)
                if(g[i][j])
                {
                    sum++;
                    bfs(i,j);
                }
        printf("%d\n",sum);
    }
    return 0;
}


 

HDU1495 非常可乐

http://acm.hdu.edu.cn/showproblem.php?pid=1495
题意:
给出两个已知容量的杯子和一瓶可乐,杯子容量和等于可乐,求是否能平均分为两半,所需最少步骤。
思路:
奇数必然无解,偶数bfs,与前面分水那题基本相同。
code:

#define N 112345

int n,m,v,u;
int flag,sum,ave,ans,res,len,ans1,ans2;
bool vis[N];
char s[101];
struct node
{
    int x,y,z;
    int now;
}tn;
int bfs()
{
    queue<node>q;
    while(!q.empty())q.pop();
    node a,b;
    memset(vis,false,sizeof(vis));
    a.x=0;a.y=0;a.z=n;a.now=0;
    q.push(a);vis[0]=true;
    while(!q.empty())
    {
        a=q.front();q.pop();
        if(a.x==n/2||a.y==n/2||a.z==n/2)
            return a.x&&a.y&&a.z?a.now+1:a.now;
        b=a;
        b.x=u;b.z=a.z-(u-a.x);b.now++;
        if(!vis[b.x*1000+b.y])
            q.push(b);
        vis[b.x*1000+b.y]=true;
        b=a;
        b.y=v;b.z=a.z-(v-a.y);b.now++;
        if(!vis[b.x*1000+b.y])
            q.push(b);
        vis[b.x*1000+b.y]=true;
        b=a;
        b.x=0;b.z=a.z+a.x;b.now++;
        if(!vis[b.x*1000+b.y])
            q.push(b);
        vis[b.x*1000+b.y]=true;
        b=a;
        b.y=0;b.z=a.z+a.y;b.now++;
        if(!vis[b.x*1000+b.y])
            q.push(b);
        vis[b.x*1000+b.y]=true;
        b=a;
        b.x=min(u,a.x+a.y);b.y=max(a.x+a.y-u,0);b.now++;
        if(!vis[b.x*1000+b.y])
            q.push(b);
        vis[b.x*1000+b.y]=true;
        b=a;
        b.y=min(v,b.x+b.y);b.x=max(a.x+a.y-v,0);b.now++;
        if(!vis[b.x*1000+b.y])
            q.push(b);
        vis[b.x*1000+b.y]=true;
    }
    return -1;
}
int main()
{
    int i,j,k,kk,t,x,y,z;
    while(scanf("%d%d%d",&n,&u,&v)!=EOF&&n)
    {
        t=n&1?-1:bfs();
        if(t==-1)
            printf("NO\n");
        else
            printf("%d\n",t);
    }
    return 0;
}


HDU2612 Find a way

http://acm.hdu.edu.cn/showproblem.php?pid=2612
题意:
Y和M要一起去一个kfc,每走一格需要11分钟,求他们去哪个kfc所需总时间和最少,
思路:
bfs两次,将两个人到每个kfc的时间打表,然后找出和最小的那个。
code:
#define N 212

int n,m;
int flag,sum,ave,ans,res,len,ans1,ans2;
int f[N][N],ff[N][N];
int g[N][N];
int dir[4][2]={0,1,0,-1,1,0,-1,0};
bool vis[N][N];
char s[N];
struct node
{
    int x,y;
    int now;
}tn;
void bfsy(int x,int y)
{
    queue<node>q;
    while(!q.empty())q.pop();
    node a,b;
    a.x=x;a.y=y;a.now=0;
    q.push(a);
    f[x][y]=0;
    while(!q.empty())
    {
        a=q.front();q.pop();
        for(int i=0;i<4;i++)
        {
            b=a;
            b.x+=dir[i][0];b.y+=dir[i][1];b.now++;
            if(g[b.x][b.y]&&f[b.x][b.y]==INF)
            {
                q.push(b);
                f[b.x][b.y]=b.now;
            }
        }
    }
}
void bfsm(int x,int y)
{
    queue<node>q;
    while(!q.empty())q.pop();
    node a,b;
    a.x=x;a.y=y;a.now=0;
    q.push(a);
    ff[x][y]=0;
    while(!q.empty())
    {
        a=q.front();q.pop();
        for(int i=0;i<4;i++)
        {
            b=a;
            b.x+=dir[i][0];b.y+=dir[i][1];b.now++;
            if(g[b.x][b.y]&&ff[b.x][b.y]==INF)
            {
                q.push(b);
                ff[b.x][b.y]=b.now;
            }
        }
    }
}
int main()
{
    int i,j,k,kk,t,x,y,xx,yy,z;
    while(scanf("%d%d",&n,&m)!=EOF&&n)
    {
        memset(g,0,sizeof(g));
        for(i=1;i<=n;i++)
        {
            scanf("%s",s);
            for(j=1;j<=m;j++)
            {
                if(s[j-1]=='#')
                    continue;
                g[i][j]++;
                if(s[j-1]=='@')
                    g[i][j]++;
                if(s[j-1]=='Y')
                    x=i,y=j;
                if(s[j-1]=='M')
                    xx=i,yy=j;
            }
        }
        memset(f,0x3f,sizeof(f));
        memset(ff,0x3f,sizeof(ff));
        bfsy(x,y);
        bfsm(xx,yy);
        res=INF;
        for(i=1;i<=n;i++)
            for(j=1;j<=m;j++)
                if(g[i][j]==2)
                    res=min(res,f[i][j]+ff[i][j]);
        printf("%d\n",11*res);
    }
    return 0;
}

HDU-1430 魔板

http://blog.youkuaiyun.com/kopyh/article/details/48517595

HDU-3567 Eight II

http://blog.youkuaiyun.com/kopyh/article/details/48738709

HDU-2181 哈密顿绕行世界问题

http://blog.youkuaiyun.com/kopyh/article/details/48738747

HDU-3533 Escape

http://blog.youkuaiyun.com/kopyh/article/details/48738787

HDU-1560 DNA sequence

http://blog.youkuaiyun.com/kopyh/article/details/48738975

ZOJ-2477 Magic Cube

http://blog.youkuaiyun.com/kopyh/article/details/48739097

HDU-3085 Nightmare Ⅱ

http://blog.youkuaiyun.com/kopyh/article/details/48739333

HDU-1067 GAP

http://blog.youkuaiyun.com/kopyh/article/details/48739601

HDU-2102 A计划

http://blog.youkuaiyun.com/kopyh/article/details/48742173

HDU-3001 Travelling

http://blog.youkuaiyun.com/kopyh/article/details/48742311

HDU 5113 Black And White

http://blog.youkuaiyun.com/kopyh/article/details/48999173

HDU 4499 Cannon

http://blog.youkuaiyun.com/kopyh/article/details/49072247






ACM菜鸟的学习笔记(1)--BFS篇 这里写自定义目录标题初识BFSBFS是什么模板题 初识BFS 最近在某大牛的熏陶下,学习了BFS,虽说BFS作为最基础的搜索算法,学起来并不费劲,但我现在还不敢说我已经完全掌握。如果有写的不对的地方,欢迎各位大佬指正。 BFS是什么 BFS全称宽度优先搜索算法(又称广度优先搜索),是最简便的图的搜索算法之一,这一算法也是很多重要的图的算法的原型。Dijkstra单源最短路径算法和Prim最小生成树... 阅读详情

相关推荐

简单搜索引擎实现(python)

了解google类似的搜索引擎是怎么实现的;攫取搜索真相。 原理描述请见:http://gaolizhong666.blog.163.com/blog/static/11561504220136242819683/

简单的搜索方法

1.顺序搜索 顺序或线性搜索是最基本的搜索算法。它的机制是,将每一个数据结构中的元素和我们要找 的元素做比较。顺序搜索是最低效的一种搜索算法。 function search(arr,item) { for(var i =0; i < arr.length; i++){ if(arr[i] == item){ return i } } return -1 } 2.二分搜索 二分搜索算法的原理和猜数字游戏类似,就是那个有人说“我正想着一个1

一个前端小白的博客 2002

简单的搜索引擎开发

一个简单的搜索引擎,能够实现基本的爬虫和搜索功能,可以实现分词 爬虫 热词推荐和文本提取

Problem--41A--Codeforces--Translation

A. Translation time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard output The translation from the Berland language into the Birland

qq_36667106的博客 952

简单搜索引擎源码

一个简单但是功能齐全的搜索引擎 实现热词推荐 分类等功能

北大POJ初级-简单搜索

北大POJ初级-简单搜索 解题报告+AC代码

【前端爬虫】关于如何获取自己的请求头信息(user-agent和cookie)

注意:由于user-agent和cookie中保存了部分账户信息,所以一定不要随意泄露给他人!!! 1.首先打开某个页面,点击键盘的F12键进入控制台,或者鼠标右键页面选择打开控制台

weixin_47040861的博客 3546

PHP 搜索查询功能实现

主要介绍了PHP 搜索查询功能的实现代码,非常不错,具有参考借鉴价值,需要的朋友可以参考下

简单的网页搜索引擎

分析:要创建⼀个简单的⽹⻚搜索引擎,需要完成⼏个步骤:⾸先,抓取多个⽹⻚的内容;• 使⽤ defaultdict(set) 创建⼀个索引,其中键是单词,值是包含该单词的URL集合。其次,需要从抓取到的内容中提取⽂本,并创建⼀个简单的索引。在这个例⼦中,索引将是⼀个字典,键是单词,值是包含该单词的⽹⻚列表。需求:抓取多个⽹⻚的内容,创建⼀个简单的索引,然后实现⼀个⼩型的搜索功能,以理解搜索技术的基本原理。最后,将实现⼀个简单的搜索功能,允许⽤⼾输⼊⼀个查询词,然后返回包含该词的所有⽹⻚。

pursue_mony的博客 1038

用豆包+Skill从零制作AI漫剧:分镜、画面、配音到成片全流程

AI漫剧作为一种新兴内容形态,结合AI绘画与AI视频生成技术,正在改变短视频创作方式。其核心原理是利用提示词工程,将创意转化为结构化分镜脚本,再通过豆包等AI助手的Skill能力,将重复的脚本生成和分镜拆解流程固化为可复用的指令模板,从而大幅降低从构思到成品的生产门槛。这种模式无需剧组、演员和实景拍摄,让个人创作者也能借助图像生成、TTS配音与剪辑合成工具,批量化地生产剧情短片,适用于短视频平台连载、商业定制与个人IP打造。围绕豆包+Skill这条主线,从选题、剧本写作、分镜表设计,到画面提示词生成、视频片

weixin_29048309的博客 1495

高通平台camera构架sensor驱动详解

优先阅读。

a5566255的专栏 3251

菜鸟系列——搜索

菜鸟就要老老实实重新学起: DFS、BFS: 优先深度搜索、优先广度搜索,思想很简单,看怎么用了。 eg: POJ3037 Skiing http://poj.org/problem?id=3037 题意: 一个矩阵各点有不同高度,从 A点到周围4个B点的速度是 V = Va*(2^(Ha-Hb))。 给出初速度,矩阵高,矩阵宽。高度矩阵。 求左上到右下所用最短时间。

MyWorld 485

微信DAT图片恢复全攻略:从文件路径到批量解密(附最新工具下载)

本文详细介绍了微信DAT图片恢复的全过程,从文件路径定位到批量解密操作,帮助用户高效恢复加密存储的图片。文章涵盖新旧版本微信的存储结构差异,推荐使用专业解密工具进行批量转换,并提供了提升恢复成功率的实用技巧和常见问题解决方案。

weixin_29325007的博客 455

菜鸟裹裹App分析系列-产品分析

近期对物流这块有些学习研究,菜鸟裹裹App作为快递行业的王牌产品,当然是学习分析的好素材。所以接下来的一系列文章,会从产品、技术、数据方面来分析这款App,通过这些分析,希望能提升自己的产品和逻辑思维,当然作为一名Android开发者,最后会高仿其中的一些主要功能,在技术上能够更上一层楼,也希望能和各位多多交流学习。 菜鸟裹裹App 菜鸟裹裹是一款提供查快递、寄快递的应用软件,主要适用于全网包...

weixin_34187822的博客 9186

无人机避障——感知篇(采用Mid360复现Fast-lio)

本文介绍了在Ubuntu 18.04和ROS Melodic环境下,使用Xavier-nx电脑和Livox Mid-360激光雷达编译和运行FAST-LIO工程的步骤,包括创建工作空间、编译驱动和FAST-LIO源码,以及运行launch文件进行建图的过程。

weixin_45390670的博客 3546

修改注册表导致开机时电脑显示“无法登陆到你的账户”的问题解决方案

1.问题描述:开机电脑显示“无法登陆到你的账户:通常可以通过从你的账户注销,然后重新登陆来解决问题,如果不立即注销,你创建的任何文件或进行的任何更改都将会丢失。” 2.问题原因:想要修改cmd中的用户名(红色部分),修改了注册表,重启时出现问题。 3.问题解决: win+R输入cmd,确定进入注册表界面,将下面的地址复制进地址栏(你也可以自己按目录查找),双击ProfileImage...

qq_33835957的博客 7万+

菜鸟系列——八数码八境界

菜鸟就要老老实实重新学起: 八数码: 很经典的搜索问题,写这个练练搜索。 八数码问题就是给出一个3*3的矩阵其中有1~8数字和一个空格‘x’,可以移动周围的数字到这个空格上,要求某种排列恢复到{{1,2,3},{4,5,6},{7,8,x}}形式的移动方法。 由大神的八数码八境界想自己实现一下 http://www.cnblogs.com/goodness/archive/20

MyWorld 6863

OTA 升级失败/回滚策略设计:打造安全可靠的双分区/断点续传/签名校验方案

双分区机制(A/B Partitioning)是OTA升级的“保险箱”。简单来说,设备存储分为两个分区:A分区(当前运行)和B分区(备用)。升级时,新固件写入B分区,A分区保持不变。如果升级成功,系统切换到B分区运行;如果失败,设备直接回滚到A分区,完全不受影响。这就像玩游戏存档:你打Boss前存了个档,万一挂了还能读档重来。双分区就是设备的“读档”机制,避免了变砖的尴尬。以Android设备为例,Google从Android 7.0开始强制引入A/B分区机制(Seamless Updates)。

大模型大数据攻城狮的专栏 1235

JAVA从菜鸟到架构师系列课程

JAVA从菜鸟到架构师系列课程 【入门篇】 J2SE的Socket网络编程应用 J2SE的反射机制高级应用 J2SE高深讲解 JAVA编程思想 中级教程 JAVA编程思想 初级教程 JAVA编程思想 高级教程 基于J2SE的QQ聊天工具开发 我来说说面向对象 【进阶篇】 CRM项目 Eclipse Hibernate JAVA WEB开发视频 JAVAWEB开发实战经典-高级案例篇 JAV...

lyb9292的博客 1476

YOLOv11改进 | Mamba-YOLOv11-L:基于SSM的高效全局建模,精度与效率的双重突破

摘要: 本文提出Mamba-YOLOv11-L,通过集成状态空间模型(SSM)改进YOLOv11的全局建模能力。针对YOLOv11在复杂场景中全局依赖缺失、精度-效率矛盾等问题,SSM以$O(N)$计算复杂度实现长程语义捕捉。改进后的模型在工业缺陷检测(Recall↑12%)、边缘设备部署(内存↓16%)、多尺度目标检测(小目标mAP↑9%)等场景表现优异,推理速度保持>40 FPS。核心创新包括轻量化SSM模块设计(稀疏状态转移+局部上下文融合)及与YOLOv11骨干的深度集成,代码实现展示了SSM

走向CTO的路上... 567

【保姆级教程】基于UNet++&MobileNetv2的语义分割模型从训练到RK3588部署:让边缘AI落地效率提升300%

通过SMP库一键构建encoder_name="mobilenet_v2", # 选择MobileNetv2作为骨干encoder_weights="imagenet", # 加载预训练权重加速收敛in_channels=3, # 输入图像通道数(RGB)classes=29, # Cityscapes数据集类别数activation=None # 输出无激活,便于后续损失计算本教程从“模型设计-训练-转换-边缘部署”全链路拆解了。

FJN110的博客 210

菜鸟开发—应具备的搜索技巧

最近在看《你的知识需要管理这本书》,里面提到有一类知识是“我知道在哪里,我知道如何找到”的知识,如果你能在需要的时候找到这些知识,同时这些知识能为你所用,那么这些知识也属于你。在搜索任何关键词的时候都会得到海量的信息—“我要的是一滴水,你却给了我整个大海。”自己有限的时间都花在了去判断无限的信息过程中:哪些有用,哪些没用。   下面给大家介绍几个搜索引擎技巧: 一、有关关键字搜索 1.关键

小火子 1437

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

菜鸟商城:开启您的移动电商之旅

菜鸟商城:开启您的移动电商之旅 【下载地址】android商城源码菜鸟商城介绍 这是一份功能齐全的Android商城源码,名为“菜鸟商城”,非常适合学习和二次开发。源码涵盖了商品浏览、分类筛选、搜索、购物车、订单管理、用户管理等核心功能,每个关键部分都附有详细注释,便于理解代码逻辑。基于成熟框架开发,具有良好的扩展性和可...

gitblog_06787的博客 362

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

宇视设备搜索工具_6个工具网站,让你快人一步,处理各种事务和工作。

1、精准云工具 精准云工具是一个在线工具导航网站,收集网络中任何的工具产品。如站长工具、日常查询类工具、恶搞工具、制作工具、下载工具、转换工具。目前收集的工具数量有好几百个,基本想要的工具都能找到。网站还有一个亮点,可以召唤二次元小姐姐「伊斯特瓦尔」,小姑凉超可爱的跟你说话,点击小姑凉身旁的骷髅按钮可以召唤各种特效,非常好玩。2、小可搜索 非常简洁但功能强大的搜索引擎。支持搜索 PPT、mobi、...

weixin_39622398的博客 2927

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Apache Doris 在菜鸟的大规模湖仓业务场景落地实践

本文介绍了 Apache Doris 在菜鸟的大规模落地的实践经验,菜鸟为什么选择 Doris,以及 Doris 如何在菜鸟从 0 开始,一步步的验证、落地,到如今上万核的规模,服务于各个业务线,Doris 已然成为菜鸟 OLAP 数据分析的最优选型。

SelectDB 1271

Linux看cid命令,Linux菜鸟简单命令

想要使用Linux,以下这些命令不可少的哦!我在工作中经常用到的大多数都是一些文件的查找,和上传下载什么的,没什么技术含量,所以除了自己整理的之外,还有借鉴的别的大神的一些命令,我会在最后标注的\(^o^)/!下面开始吧:系统信息arch 显示机器的处理器架构(1)uname -m 显示机器的处理器架构(2)uname -r 显示正在使用的内核版本dmidecode -q 显示硬件系统部件 - (...

weixin_39520880的博客 275
上一篇: HDU-1430 魔板
下一篇: HDU-3567 Eight II
kopyh
博客等级 码龄12年 20粉丝 152原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值