【kuangbin专题一】简单搜索 (完整)

1. poj 1321 棋盘排列 类似八皇后
/*
    poj 1321 棋盘排列
    类似八皇后的排列搜索。
*/
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
typedef long long ll;
int dp[11][11];
char mp[11][11];

int col[11];
int dfs(int i,int n,int k){
    if(k==0)return 1;
    if(i<0)return 0;
    int ans=dfs(i-1,n,k);//这行一个不取
    for(int j=0;j<n;j++){
        if(mp[i][j]=='.')continue;
        if(col[j])continue;
        col[j]=1;
        ans+=dfs(i-1,n,k-1);//这行取一个
        col[j]=0;
    }
    return ans;
}

int main(){
    int n,k;
    while(~scanf("%d%d",&n,&k)){
        if(n==-1&&k==-1)break;
        for(int i=0;i<n;i++){
            scanf("%s",mp[i]);
        }
        memset(col,0,sizeof(col));
        printf("%d\n",dfs(n-1,n,k));
       // printf("%d",get_ans(n,k));
    }
}

2.poj 2251 dungeon master 三维地图搜索

/*
    poj 2251 dungeon master
    三维地图搜索
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
int L,R,C;
char mp[33][33][33];
int dis[33][33][33];
int dx[]={-1,1,0,0,0,0};
int dy[]={0,0,-1,1,0,0};
int dz[]={0,0,0,0,-1,1};
struct POS{
    int x,y,z;
    POS(){}
    POS(int xx,int yy,int zz){x=xx,y=yy,z=zz;}
};
POS st,ed;
void bfs(){
    memset(dis,-1,sizeof(dis));
    queue<POS> q;
    dis[st.x][st.y][st.z]=0;
    q.push(st);
    while(!q.empty()){
        POS now = q.front();
        q.pop();
        for(int i=0;i<6;i++){
            int nx=dx[i]+now.x;
            int ny=dy[i]+now.y;
            int nz=dz[i]+now.z;
            if(nx>=0&&nx<L&&ny>=0&&ny<R&&nz>=0&&nz<C&&dis[nx][ny][nz]<0){
                if(mp[nx][ny][nz]=='.'){
                    dis[nx][ny][nz]=dis[now.x][now.y][now.z]+1;
                    q.push(POS(nx,ny,nz));
                }
                if(mp[nx][ny][nz]=='E'){
                    dis[nx][ny][nz]=dis[now.x][now.y][now.z]+1;return;
                }
            }
        }
    }
}

int main(){
    while(~scanf("%d%d%d",&L,&R,&C)&&(L+R+C)){
        for(int i=0;i<L;i++){
            for(int j=0;j<R;j++){
                scanf("%s",mp[i][j]);
                for(int k=0;k<strlen(mp[i][j]);k++){
                    if(mp[i][j][k]=='S'){
                        st.x=i,st.y=j,st.z=k;
                    }
                    else if(mp[i][j][k]=='E'){
                        ed.x=i,ed.y=j,ed.z=k;
                    }
                }
            }
        }
        bfs();
        if(dis[ed.x][ed.y][ed.z]<0)
            printf("Trapped!\n");
        else
            printf("Escaped in %d minute(s).\n",dis[ed.x][ed.y][ed.z]);
    }
    return 0;
}

3.poj 3278 Catch That Cow 直线bfs 非贪心。

/*
    poj 3278 Catch That Cow
    直线bfs 非贪心。
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
const int nmax=100100;
int dis[nmax];
int N,K;
int bfs(){
    memset(dis,-1,sizeof(dis));
    queue<int>q;
    q.push(N);
    dis[N]=0;
    while(!q.empty()){
        int now=q.front();
        q.pop();
        //printf("%d: %d\n",now,dis[now]);
        if(now==K)return dis[K];
        if(now+1<nmax&&dis[now+1]<0){
            dis[now+1]=dis[now]+1;
            q.push(now+1);
        }
        if(now-1>=0&&dis[now-1]<0){
            dis[now-1]=dis[now]+1;
            q.push(now-1);
        }
        if(now*2<nmax&&dis[now*2]<0){
            dis[now*2]=dis[now]+1;
            q.push(now*2);
        }
    }
}
int main(){
    scanf("%d%d",&N,&K);
    printf("%d\n",bfs());
    return 0;
}

4. poj 3279 Fliptile 穷举第一列判断是否可行。

/**
    POJ - 3279 Fliptile
    穷举第一列判断是否可行。
*/
#include<iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int inf=1e9;
int n,m;
int mp[22][22],res[22][22],tmp[22][22];
int ansmp[22][22];
int dx[]={-1,1,0,0};
int dy[]={0,0,-1,1};
int ans=inf;
void fan(int x,int y){
    res[x][y]=!res[x][y];
    tmp[x][y]=1;
    for(int i=0;i<4;i++){
        int nx=x+dx[i];
        int ny=y+dy[i];
        if(nx>=0&&nx<m&&ny>=0&&ny<n){
            res[nx][ny]=!res[nx][ny];
        }
    }
}
void dfs(int r,int tcnt){
    if(r==m){
        int flag=1;
        for(int j=0;j<n;j++){
            if(res[r-1][j])flag=0;
        }
        if(flag){
            if(ans>tcnt){
                ans=tcnt;
                memcpy(ansmp,tmp,sizeof(tmp));
            }
        }
        return;
    }
    for(int j=0;j<n;j++){
        if(res[r-1][j]){
            fan(r,j);
            tcnt++;
        }
    }
    dfs(r+1,tcnt);
}


int main(){
    scanf("%d%d",&m,&n);
    for(int i=0;i<m;i++){
        for(int j=0;j<n;j++){
            scanf("%d",&mp[i][j]);
        }
    }

    int upp=1<<n;
    for(int i=0;i<upp;i++){
        memcpy(res,mp,sizeof(mp));
        memset(tmp,0,sizeof(tmp));
        int tt=0;
        for(int j=0;j<n;j++){
            if(i&(1<<j)){
                fan(0,j);
                tt++;
            }
        }
        dfs(1,tt);
    }
    if(ans!=inf){
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                if(j)printf(" ");
                printf("%d",ansmp[i][j]);
            }printf("\n");
        }
    }
    else{
        printf("IMPOSSIBLE\n");
    }
    return 0;
}

5. poj 1426 find the multiple 找倍数。爆搜。

/**
    POJ-1426 find the multiple
    找倍数。爆搜。
*/
#include <iostream>
#include <cstdio>
using namespace std;
typedef long long ll;
ll a[222];
void dfs(int wei,int mod,int n,ll val){
    if(a[n])return;
    if(val&&mod==0){
        a[n]=val;return;
    }
    if(wei==19){
        return;
    }
    ll ans=0;
    dfs(wei+1,(mod*10+1)%n,n,val*10+1);
    if(!a[n])
        dfs(wei+1,(mod*10)%n,n,val*10);
}

int main(){
    int n;
    while(~scanf("%d",&n)&&n){
        dfs(0,0,n,0);
        printf("%lld\n",a[n]);
    }
    return 0;
}

6. poj 3126 prime path 素数+bfs

/**
    poj 3126 prime path
    素数+bfs
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
const int nmax=10000;
int notp[nmax+100],prime[nmax],ptot;
int dist[nmax+10];
void init(){
    for(int i=2;i<nmax;i++){
        if(!notp[i]){
            prime[ptot++]=i;
        }
        for(int j=0;j<ptot&&prime[j]*i<=nmax;j++){
            notp[prime[j]*i]=1;
            if(i%prime[j]==0)break;
        }
    }
}
void bfs(int st,int ed){
    memset(dist,-1,sizeof(dist));
    queue<int> q;
    q.push(st);
    dist[st]=0;
    while(!q.empty()){
        int now=q.front();
        //printf("dist[%d]:%d\n",now,dist[now]);
        if(now==ed){
            printf("%d\n",dist[now]);
            return;
        }
        q.pop();
        for(int i=1;i<=1000;i*=10){
            int nex=now-((now/i)%10)*i;
            //printf("%d\n",nex);
            for(int j=0;j<10;j++){
                if(i==1000&&j==0)continue;
                if( !notp[nex+i*j] && dist[nex+i*j]<0 ){
                    dist[nex+i*j]=dist[now]+1;
                    q.push(nex+i*j);
                }
            }
        }
    }
}
int main(){
    init();
    int t,st,ed;
    scanf("%d",&t);
    while(t--){
        scanf("%d%d",&st,&ed);
        bfs(st,ed);
    }
    return 0;
}

7. poj 3087 Shuffle’m Up 洗牌模拟 不是搜索。

/**
    poj 3087 Shuffle'm Up
    洗牌模拟 不是搜索。
    SB的两个错。
    1.CE:cin要加#include<string>
    2.WA:cas没有++
*/
#include <iostream>
#include <cstdio>
#include <string>
#include <map>
using namespace std;
map<string ,int >mp;

int main(){
    int t,cas=1;
    int n;
    string s1,s2,ed;
    scanf("%d",&t);
    while(t--){
        scanf("%d",&n);
        cin>>s1;
        cin>>s2;
        cin>>ed;

        string tmp;
        for(int i=0;i<n;i++){
            tmp+=s2[i];
            tmp+=s1[i];
        }

        int steps=1,ans=-1;
        while(!mp[tmp]){
            mp[tmp]=1;
            if(tmp==ed){
                ans=steps;
                break;
            }
            s1=tmp.substr(0,n);
            s2=tmp.substr(n,n);
            tmp.clear();
            for(int i=0;i<n;i++){
                tmp+=s2[i];
                tmp+=s1[i];
            }
            steps++;
        }
        printf("%d %d\n",cas++,ans);
    }
    return 0;
}

8. poj 3414 Pots 倒水最短路线。记录路线。

/**
    POJ 3414 Pots
    倒水最短路线。记录路线。
*/
#include <iostream>
#include <cstdio>
#include <queue>
#include <cstring>
using namespace std;
int a,b,c,flag=0;
typedef pair<int,int> P;
int dist[111][111];
P fr[111][111],ed;
int routes[111][111];


void bfs(){
    memset(dist,-1,sizeof(dist));
    queue<P> q;
    q.push(P(0,0));
    routes[0][0]=-1;
    dist[0][0]=0;
    while(!q.empty()){
        P now =q.front();
        q.pop();
        int nx=now.first;
        int ny=now.second;
//        printf("(%d,%d)\n",nx,ny);
        if(nx==c||ny==c){
//            printf("%d %d %d\n",nx,ny,dist[nx][ny]);
            ed=P(nx,ny);
            return;
        }
        //1 fill(1)
        if ( dist[a][ny]<0 || dist[a][ny]>dist[nx][ny]+1 ){
            dist[a][ny]=dist[nx][ny]+1;
            routes[a][ny]=1;
            fr[a][ny]=P(nx,ny);
            q.push(P(a,ny));
        }
        //2 fill(2)
        if ( dist[nx][b]<0 || dist[nx][b]>dist[nx][ny]+1 ){
            dist[nx][b]=dist[nx][ny]+1;
            routes[nx][b]=2;
            fr[nx][b]=P(nx,ny);
            q.push(P(nx,b));
        }
        //3 drop(1)
        if ( dist[0][ny]<0 || dist[0][ny]>dist[nx][ny]+1 ){
            dist[0][ny]=dist[nx][ny]+1;
            routes[0][ny]=3;
            fr[0][ny]=P(nx,ny);
            q.push(P(0,ny));
        }
        //4 drop(2)
        if ( dist[nx][0]<0 || dist[nx][0]>dist[nx][ny]+1 ){
            dist[nx][0]=dist[nx][ny]+1;
            routes[nx][0]=4;
            fr[nx][0]=P(nx,ny);
            q.push(P(nx,0));
        }
        //5 pull(1,2)
        int bneed=min(b-ny,nx);
        if ( dist[nx-bneed][ny+bneed]<0 || dist[nx-bneed][ny+bneed] > dist[nx][ny]+1 ){
            dist[nx-bneed][ny+bneed] = dist[nx][ny]+1;
            routes[nx-bneed][ny+bneed] = 5;
            fr[nx-bneed][ny+bneed]=P(nx,ny);
            q.push(P(nx-bneed,ny+bneed));
        }
        //6 pull(2,1)
        int aneed=min(ny,a-nx);
        if ( dist[nx+aneed][ny-aneed]<0 || dist[nx+aneed][ny-aneed] > dist[nx][ny]+1 ){
            dist[nx+aneed][ny-aneed] = dist[nx][ny]+1;
            routes[nx+aneed][ny-aneed] = 6;
            fr[nx+aneed][ny-aneed]=P(nx,ny);
            q.push(P(nx+aneed,ny-aneed));
        }
    }

}
void print(){
    printf("%d\n",dist[ed.first][ed.second]);
    P tmp =ed;
    //printf("(%d %d)\n",tmp.first,tmp.second);
    vector<int> ans;
    while(routes[tmp.first][tmp.second]!=-1){
      //  printf("(%d %d)\n",tmp.first,tmp.second);
        ans.push_back(routes[tmp.first][tmp.second]);
        tmp=fr[tmp.first][tmp.second];
    }
    for(int i=ans.size()-1;i>=0;i--){
        if(ans[i]==1)printf("FILL(1)\n");
        if(ans[i]==2)printf("FILL(2)\n");
        if(ans[i]==3)printf("DROP(1)\n");
        if(ans[i]==4)printf("DROP(2)\n");
        if(ans[i]==5)printf("POUR(1,2)\n");
        if(ans[i]==6)printf("POUR(2,1)\n");
    }
}
int main(){

    scanf("%d%d%d",&a,&b,&c);
    ed=P(-1,-1);
    bfs();
    if(ed==P(-1,-1))printf("impossible");
    else print();
    return 0;
}

9. fzu 2150 Fire Game 双起点bfs。

/**
    fzu 2150
    双起点bfs。
    注意起点重复位置不用算两次,否则tle。
*/
#include <iostream>
#include <cstdio>
#include <queue>
#include <cstring>
using namespace std;
typedef pair<int,int> P;
char mp[12][12];
int tag[12][12];
int dist[12][12],inq[12][12];
int dx[]={-1,1,0,0};
int dy[]={0,0,1,-1};
int n,m;
void dfs(int nx,int ny,int cc){
    tag[nx][ny]=cc;
    for(int i=0;i<4;i++){
        int tx=nx+dx[i];
        int ty=ny+dy[i];
        if( tx>=0&&tx<n && ty>=0&&ty<m && mp[tx][ty]=='#' ){
            if(!tag[tx][ty]){
                dfs(tx,ty,cc);
            }
        }
    }
}
void bfs(int stx,int sty){
    queue<P> q;
    memset(inq,0,sizeof(inq));
    q.push(P(stx,sty));
    dist[stx][sty]=0;
    while(!q.empty()){
        P now =q.front();
        q.pop();
        inq[now.first][now.second]=0;
        for(int i=0;i<4;i++){
            int nx=now.first+dx[i];
            int ny=now.second+dy[i];
            if( nx>=0&&nx<n && ny>=0&&ny<m &&mp[nx][ny]=='#' ){
                if( dist[nx][ny]<0 || dist[nx][ny]>dist[now.first][now.second]+1 ){
                    dist[nx][ny] = dist[now.first][now.second]+1;
                    if(!inq[nx][ny]){
                        q.push(P(nx,ny));
                        inq[nx][ny]=1;
                    }
                }
            }
        }
    }
}
int judge(){
    int maxdist=0;
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            if(mp[i][j]=='#'){
                if(dist[i][j]<0)return -1;
                maxdist=max(maxdist,dist[i][j]);
            }
        }
    }
    return maxdist;
}
int main(){
    int cas=1,t;
    scanf("%d",&t);
    while(t--){
        scanf("%d%d",&n,&m);
        memset(tag,0,sizeof(tag));
        for(int i=0;i<n;i++){
            scanf("%s",mp[i]);
        }
        int cnt=1;
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                if(mp[i][j]=='#'&&!tag[i][j]){
                    dfs(i,j,cnt);
                    cnt++;
                }
            }
        }
        if(cnt>3){
            printf("Case %d: -1\n",cas++);
        }
        else{
            int ans=11111;
            for(int i=0;i<n;i++){
                for(int j=0;j<m;j++){
                    for(int k=i;k<n;k++){
                        for(int l=0;l<m;l++){
                            if(mp[i][j]=='.'||mp[k][l]=='.')continue;
                            memset(dist,-1,sizeof(dist));
                            bfs(i,j);
                            bfs(k,l);
                            int tt=judge();
                            if(tt>=0){
 //                               printf("(%d,%d)-(%d,%d): %d\n",i,j,k,l,tt);
                                ans=min(ans,tt);
                            }
                        }
                    }
                }
            }
            printf("Case %d: %d\n",cas++,ans);
        }
    }
    return 0;
}

10. uva 11624 火灾逃生 双向bfs预处理

/**
    uva 11624 火灾逃生
    火灾蔓延+逃生双向bfs通过预处理,两次跑完。
    当fdist>dist||fdist<0时可以跑
    wa点:
    1.fire不止一个。不好用曼哈顿。
    2.fire可能到不了你逃跑位置。fdist<0也是可以通行。
*/
#include <iostream>
#include <cstdio>
#include <queue>
#include <cstring>
#include <cmath>
using namespace std;
const int nmax=1011;
typedef pair<int,int> P;
int n,m,sx,sy,fx,fy;
char mp[nmax][nmax];
int dist[nmax][nmax],fdist[nmax][nmax];
int dx[]={-1,1,0,0};
int dy[]={0,0,-1,1};
void bfs(){
    memset(dist,-1,sizeof(dist));
    queue<P> q;
    q.push(P(sx,sy));
    dist[sx][sy]=0;
    while(!q.empty()){
        int nx=q.front().first;
        int ny=q.front().second;
        //printf("(%d,%d)\n",nx,ny);
        q.pop();
        if(nx==0||nx==n-1||ny==0||ny==m-1){
            printf("%d\n",dist[nx][ny]+1);
            return;
        }
        for(int i=0;i<4;i++){
            int tx=nx+dx[i];
            int ty=ny+dy[i];
            if(tx>=0&&tx<n&&ty>=0&&ty<m&&mp[tx][ty]=='.'){
                if(fdist[tx][ty]<0||fdist[tx][ty]>dist[nx][ny]+1){
                    if(dist[tx][ty]<0||dist[tx][ty]>dist[nx][ny]+1){
                        dist[tx][ty]=dist[nx][ny]+1;
                        q.push(P(tx,ty));
                    }
                }
            }
        }
    }
    printf("IMPOSSIBLE\n");
}
void firebfs(){
    memset(fdist,-1,sizeof(fdist));
    queue<P> q;
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            if(mp[i][j]=='F'){
                fdist[i][j]=0;
                q.push(P(i,j));
            }
        }
    }
    while(!q.empty()){
        P now = q.front();
        q.pop();
        for(int i=0;i<4;i++){
            int nx=now.first+dx[i];
            int ny=now.second+dy[i];
            if(nx>=0&&nx<n&&ny>=0&&ny<m&& mp[nx][ny]!='#'){
                if(fdist[nx][ny]<0){
                    fdist[nx][ny]=fdist[now.first][now.second]+1;
                    q.push(P(nx,ny));
                }
            }
        }
    }
//    for(int i=0;i<n;i++){
//        for(int j=0;j<m;j++){
//            printf("%d ",fdist[i][j]);
//        }cout<<endl;
//    }
}
int main(){
    int t;
    freopen("in.txt","r",stdin);
    freopen("out.txt","w",stdout);
    scanf("%d",&t);
    while(t--){
        scanf("%d%d",&n,&m);
        for(int i=0;i<n;i++){
            scanf("%s",mp[i]);
            for(int j=0;j<m;j++){
                if(mp[i][j]=='J'){sx=i,sy=j;}
            }
        }
        firebfs();
        bfs();
    }
    return 0;
}

11. poj 3984 迷宫路径记录

/**
    poj-3984迷宫路径记录
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#define x first
#define y second
using namespace std;
typedef pair<int,int> P;
int mp[22][22];
int dist[8][8],fr[22][22];
int dx[]={-1,1,0,0};
int dy[]={0,0,-1,1};
void bfs(){
    P ed=P(4,4);
    memset(dist,-1,sizeof(dist));
    queue<P> q;
    q.push(P(0,0));
    dist[0][0]=0;
    fr[0][0]=-1;

    while(!q.empty()){
        P now=q.front();
        q.pop();
        if(now==ed){return;}
        for(int i=0;i<4;i++){
            int nx=now.x+dx[i];
            int ny=now.y+dy[i];
            if(nx>=0&&nx<5&&ny>=0&&ny<5&&mp[nx][ny]==0){
                if(dist[nx][ny]<0||dist[nx][ny]>dist[now.x][now.y]+1){
                    dist[nx][ny]=dist[now.x][now.y]+1;
                    fr[nx][ny]=i;
                    q.push(P(nx,ny));
                }
            }
        }
    }
}
void print(){
    int nx=4,ny=4;
    vector<P> ans;
    while(nx+ny){
        ans.push_back(P(nx,ny));
        int tx=nx-dx[fr[nx][ny]];
        int ty=ny-dy[fr[nx][ny]];
        nx=tx;
        ny=ty;
    }
    printf("(0, 0)\n");
    for(int i=ans.size()-1;i>=0;i--){
        printf("(%d, %d)\n",ans[i].x,ans[i].y);
    }
}
int main(){
    for(int i=0;i<5;i++){
        for(int j=0;j<5;j++){
            scanf("%d",&mp[i][j]);
        }
    }
    bfs();
    print();
    return 0;
}

12. hdu 1241 傻瓜计数

#include <bits/stdc++.h>
using namespace std;
const int nmax=111;
int n,m;
char mp[nmax][nmax];
int dx[]={-1,1,0,0,1,-1,1,-1};
int dy[]={0,0,1,-1,1,1,-1,-1};

void dfs(int nx,int ny){
    mp[nx][ny]='*';
    for(int i=0;i<8;i++){
        int tx=nx+dx[i];
        int ty=ny+dy[i];
        if(tx>=0&&tx<n&&ty>=0&&ty<m&&mp[tx][ty]=='@'){
            dfs(tx,ty);
        }
    }
}
int main(){
    while(~scanf("%d%d",&n,&m)&&(n+m)){
        for(int i=0;i<n;i++){
            scanf("%s",mp[i]);
        }
        int cnt=0;
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                if(mp[i][j]=='@'){
                    dfs(i,j);
                    cnt++;
                }
            }
        }
        cout<<cnt<<endl;
    }
    return 0;
}

13. hdu 1495 倒可乐2 (神奇数论

/**
    hdu1495 倒可乐2(神奇数论
    桶1:a 桶2:b a>b
    a倒入b x次 b倒入a y次
    ax+by=(a+b)/2
    设gcd(a,b)=g;
    a=cg,b=dg,gcd(c,d)=1,   c、d为奇数
    若(a+b)/2%g!=0 无解
    若(a+b)/2%g==0
        转化为cx+dy=(c+d)/2
        x=1/2,y=1/2
        有整数解x=(1+d)/2,y=(1-c)/2
        通解:x'=(1+d)/2+kd, y'=(1-c)/2-kc
        又因a>b x'>0,y'<0
        |x'|+|y'|   =(1+d)/2+kd+kc+(c-1)/2
                    =k(d+c)+(c+d)/2
                    =(c+d)(1/2+k)
                    >=(c+d)/2
        总操作需要加上 s-a b-s (c+d)/2*2=c+d
        最后一次b不用倒入s: (c+d)-1
*/
#include <bits/stdc++.h>
using namespace std;

int gcd(int a,int b){
    return b==0?a:gcd(b,a%b);
}
int main(){
    int tot,a,b;
    while(~scanf("%d%d%d",&tot,&a,&b)&&(a+b+tot)){
        int g=gcd(a,b);
        tot/=g;//(a+b)/g=c+d gcd(c,d)=1 c d为奇数
        if(tot%2){printf("NO\n");}
        else{
            int ans=tot-1;
            printf("%d\n",ans);
        }
    }
}

14. hdu 2612 find a way 寻找kfc。

转换角度BFS->人少,kfc多。搜人到kfc距离。

/**
    hdu 2612 find a way
    寻找kfc
    转换角度->人少,kfc多。搜人到kfc距离。
*/
#include <bits/stdc++.h>
#define x first
#define y second
using namespace std;
typedef pair<int,int>P;
const int nmax=222;
int dx[]={-1,1,0,0};
int dy[]={0,0,-1,1};

int n,m;
char mp[nmax][nmax];
int dist[2][nmax][nmax];

void bfs(int sx,int sy,int tag){
    queue<P> q;
    q.push(P(sx,sy));
    dist[tag][sx][sy]=0;
    while(!q.empty()){
        P now = q.front();
        q.pop();
        for(int i=0;i<4;i++){
            int nx=now.x+dx[i];
            int ny=now.y+dy[i];
            if(nx>=0&&nx<n&&ny>=0&&ny<m&&mp[nx][ny]!='#'){
                if(dist[tag][nx][ny]<0||dist[tag][nx][ny]>dist[tag][now.x][now.y]+1){
                    dist[tag][nx][ny]=dist[tag][now.x][now.y]+1;
                    q.push(P(nx,ny));
                }
            }
        }
    }
}
int main(){
    while(~scanf("%d%d",&n,&m)){
        for(int i=0;i<n;i++)
            scanf("%s",mp[i]);
        memset(dist,-1,sizeof(dist));
        for(int i=0;i<n;i++)
            for(int j=0;j<m;j++)
                if(mp[i][j]=='Y')bfs(i,j,0);
                else if(mp[i][j]=='M')bfs(i,j,1);

        int mx=1e9;
        for(int i=0;i<n;i++)
            for(int j=0;j<m;j++)
            if(mp[i][j]=='@'){
                if(dist[0][i][j]>0&&dist[1][i][j]>0)
                    mx=min(dist[0][i][j]+dist[1][i][j],mx);
            }
        printf("%d\n",mx*11);
    }
    return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值