信息学奥赛一本通(C++版) 第二部分 基础算法 第八章 广度优先搜索算

来源:互联网 发布:下颌第一磨牙雕刻数据 编辑:程序博客网 时间:2024/06/06 12:29

信息学奥赛一本通(C++版) 第二部分 基础算法 第八章 广度优先搜索算

http://ybt.ssoier.cn:8088

//1329 【例8.2】细胞
//编写过程中,发现输入数据用整数无法读取,要采用字符串形式
//核心思路,将非零数字字符改成0字符
//将代码修改,提交AC
#include <stdio.h>
int n,m,next[][2]={{1,0},{-1,0},{0,1},{0,-1}};
char a[1000][1000];
struct node{
    int r,c;
}q[1000000];
void bfs(int x,int y){
    int i,j,h,t,r,c,nr,nc,k;
    h=t=1;
    q[t].r=x,q[t].c=y,t++;
    while(h<t){
        r=q[h].r,c=q[h].c,a[r][c]='0';
        for(k=0;k<4;k++){
            nr=r+next[k][0],nc=c+next[k][1];
            if(0<=nr&&nr<n&&0<=nc&&nc<m&&a[nr][nc]!='0'){
                q[t].r=nr,q[t].c=nc,t++;
            }
        }
        h++;
    }
}
int main(){
    int i,j,cnt=0;
    scanf("%d%d",&n,&m);
    for(i=0;i<n;i++)
        scanf("%s",a[i]);
    for(i=0;i<n;i++)
        for(j=0;j<m;j++)
            if(a[i][j]!='0'){
                cnt++;
                bfs(i,j);
            }
    printf("%d",cnt);
    return 0;
}

//1330 【例8.3】最少步数
//该题的难度,体现在下一步的坐标运算,马走日,有8种,马走田,有4种
//样例通过,提交,测试点4 答案错误,
//今仔细排查,发现马走日的8个坐标中的一个坐标计算错误,修改,提交AC 2017-11-14 18:47
#include <stdio.h>
#include <string.h>
int a[110][110],vis[110][110];
int next[][2]={{-2,1},{-1,2},{1,2},{2,1},{2,-1},{1,-2},{-1,-2},{-2,-1},{-2,2},{2,2},{2,-2},{-2,-2}};//仔细一查,此处写成 int next[][2]={{-2,1},{-1,2},{1,2},{2,1},{2,-1},{1,-2},{-1,-2},{-1,-2},{-2,2},{2,2},{2,-2},{-2,-2}};
struct node{
    int r,c,s;
}q[11000];//此处写成q[10100]
void bfs(int x,int y){
    int h,t,r,c,nr,nc,s,k;
    memset(vis,0,sizeof(vis));
    h=t=1;
    q[t].r=x,q[t].c=y,q[t].s=0,t++,vis[x][y]=1;//此处再次写成vis[r][c]=1,低级错误
    while(h<t){
        r=q[h].r,c=q[h].c,s=q[h].s;
        if(r==1&&c==1){
            printf("%d\n",s);
            break;
        }
        for(k=0;k<12;k++){
            nr=r+next[k][0],nc=c+next[k][1];
            if(1<=nr&&nr<=100&&1<=nc&&nc<=100&&vis[nr][nc]==0){
                vis[nr][nc]=1;
                q[t].r=nr,q[t].c=nc,q[t].s=s+1,t++;
            }
        }
        h++;
    }
}
int main(){
    int ar,ac,br,bc;
    scanf("%d%d%d%d",&ar,&ac,&br,&bc);
    bfs(ar,ac);
    bfs(br,bc);
    return 0;
}
//1248 Dungeon Master
//此题困惑已久,一直在想,三维如何处理,很想看他人代码,但还是忍住了
//来收割“第八章 广度优先搜索算”未做的最后一题,突然想到,用三维数组啊,顿悟啊。
//该题没给数据范围
//看代码,觉得该题简单,但该题要能独立写出,思维明显上了一个台阶,该题证明了本人思维的进步。
//样例通过,提交AC,一次性成功,从二维数组,到该题写成三维数组,真是不敢想象,思维的进步是杠杠的。2017-11-25 21:55
#include <stdio.h>
#include <string.h>
int A,B,C,next[][3]={{1,0,0},{-1,0,0},{0,1,0},{0,-1,0},{0,0,1},{0,0,-1}},vis[100][100][100];
char s[100][100][100];
struct node{
    int a,b,c,step;
}q[1000000];
void bfs(int sa,int sb,int sc,int ea,int eb,int ec){
    int h,t,a,b,c,na,nb,nc,k,step,flag=0;
    memset(vis,0,sizeof(vis));
    h=t=1;
    q[t].a=sa,q[t].b=sb,q[t].c=sc,q[t].step=0,t++,vis[sa][sb][sc]=1;
    while(h<t){
        a=q[h].a,b=q[h].b,c=q[h].c,step=q[h].step;
        if(a==ea&&b==eb&&c==ec){
            printf("Escaped in %d minute(s).\n",step),flag=1;
            break;
        }
        for(k=0;k<6;k++){
            na=a+next[k][0],nb=b+next[k][1],nc=c+next[k][2];
            if(0<=na&&na<A&&0<=nb&&nb<B&&0<=nc&&nc<C&&s[na][nb][nc]=='.'&&vis[na][nb][nc]==0){
                vis[na][nb][nc]=1;
                q[t].a=na,q[t].b=nb,q[t].c=nc,q[t].step=step+1,t++;
            }
        }
        h++;
    }
    if(flag==0)printf("Trapped!\n");
}
int main(){
    int i,j,k,sa,sb,sc,ea,eb,ec;
    while(scanf("%d%d%d",&A,&B,&C)&&A&&B&&C){
        for(i=0;i<A;i++)
            for(j=0;j<B;j++)
                scanf("%s",s[i][j]);
        for(i=0;i<A;i++)
            for(j=0;j<B;j++)
                for(k=0;k<C;k++){
                    if(s[i][j][k]=='S')sa=i,sb=j,sc=k;
                    if(s[i][j][k]=='E')ea=i,eb=j,ec=k,s[i][j][k]='.';//请注意a[i][j][k]='.'技巧,将'E'改成'.'
                }
        bfs(sa,sb,sc,ea,eb,ec);
    }
    return 0;
}


//1249 Lake Counting
//POJ 2386 Lake Counting
//P1596 [USACO10OCT]湖计数Lake Counting
//虽然很不愿意数组从0元素开始,但是面对字符串也只好这样。
//提交,测试点6,运行错误,
//提供一组测试数据
//输入:
100 100
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
//输出:
1
//在添加进队列时,马上将'W'改成'.',会比较省空间。
//若将数据从队首取出时,再将'W'改成'.',会反复将'W'加入队列,十分浪费空间。
//本题又学会一招。
//洛谷,POJ,ybt提交,AC 2017-11-14 20:13
#include <stdio.h>
int n,m,next[][2]={{-1,0},{1,0},{0,-1},{0,1},{-1,1},{1,1},{1,-1},{-1,-1}};
char a[120][120];
struct node{
    int r,c;
}q[13000];
void bfs(int x,int y){
    int r,c,nr,nc,k,h,t;
    h=t=1;
    q[t].r=x,q[t].c=y,t++,a[x][y]='.';//此处又写成a[r][c]='.'//此处添加a[r][c]='.';
    while(h<t){
        r=q[h].r,c=q[h].c;
        for(k=0;k<8;k++){
            nr=r+next[k][0],nc=c+next[k][1];
            if(0<=nr&&nr<n&&0<=nc&&nc<m&&a[nr][nc]=='W')//此处次写成if(0<=nr&&nr<n&&0<=nc&&nc<m),缺斤短两
                q[t].r=nr,q[t].c=nc,t++,a[nr][nc]='.';//此处再次写成a[r][c]='.'//此处添加a[r][c]='.'//此处再次写成,q[t].r=nr,q[t],c=nc,t++;笔误难免
        }
        h++;
    }
}
int main(){
    int i,j,cnt=0;
    scanf("%d%d",&n,&m);
    for(i=0;i<n;i++)
        scanf("%s",a[i]);//此处写成scanf("%d",a[i]);,低级中的低级
    for(i=0;i<n;i++)
        for(j=0;j<m;j++)
            if(a[i][j]=='W'){//此处写成 if(a[i][j]=='w')
                cnt++;
                bfs(i,j);
            }
    printf("%d",cnt);
    return 0;
}

//1250 The Castle
//https://www.cnblogs.com/huashanqingzhu/p/7259843.html里面的代码扫了一眼,有数了
//上色问题
//样例通过,提交AC
//该题的难点,bfs中 (a[r][c]&b[k])==0而不是 (a[nr][nc]&b[k])==0     2017-11-19 21:35
#include <stdio.h>
#include <string.h>
int b[4]={1,2,4,8};
int next[][2]={{0,-1},{-1,0},{0,1},{1,0}};
int a[55][55],vis[55][55],cnt=0,max=0,row,col;
struct node{
    int r,c;
}q[3000];
void bfs(int i,int j){
    int k,h,t,r,c,nr,nc,ans;
    h=t=1;
    q[t].r=i,q[t].c=j,t++,vis[i][j]=1,ans=1;//此处漏了t++
    while(h<t){
        r=q[h].r,c=q[h].c;
        for(k=0;k<4;k++){
            nr=r+next[k][0],nc=c+next[k][1];
            if(1<=nr&&nr<=row&&1<=nc&&nc<=col&&vis[nr][nc]==0&&(a[r][c]&b[k])==0){//此处写成((a[nr][nc]&b[k])==0)//此处写成 (a[nr][nc]&b[k]==0)
                vis[nr][nc]=1,q[t].r=nr,q[t].c=nc,t++,ans++;
            }
        }
        h++;
    }
    if(ans>max)max=ans;
    cnt++;
}
int main(){
    int i,j;
    memset(vis,0,sizeof(vis));
    scanf("%d%d",&row,&col);
    for(i=1;i<=row;i++)
        for(j=1;j<=col;j++)
            scanf("%d",&a[i][j]);
    for(i=1;i<=row;i++)
        for(j=1;j<=col;j++)
            if(vis[i][j]==0)
                bfs(i,j);
    printf("%d\n%d\n",cnt,max);
    return 0;
}
 


//1251 仙岛求药
//题目此句有问题,"计数包括初始位置的方块",实际计算中,初始位置的方块记为0
//AC 2017-11-13 22:27AC
//最大难点,是该句没写好,(a[nr][nc]=='.'||a[nr][nc]=='*')
#include <stdio.h>
#include <string.h>
char a[25][25];
struct node{
    int r,c,s;
}q[1000];
int next[][2]={{1,0},{-1,0},{0,1},{0,-1}};
int vis[25][25];
int main(){
    int row,col,i,j,sr,sc,er,ec,h,t,r,c,nr,nc,k,s,flag;
    while(scanf("%d%d",&row,&col)&&row&&col){
        memset(vis,0,sizeof(vis)),flag=0;
        for(i=0;i<row;i++)
            scanf("%s",a[i]);
        for(i=0;i<row;i++)
            for(j=0;j<col;j++)//注意,字符串是从角标0开始读取
                if(a[i][j]=='@')sr=i,sc=j;//开始位置
                else if(a[i][j]=='*')er=i,ec=j;//此处写成else if(a[i][j]='*')er=i,ec=j;低级错误,查了好久//结束位置
        h=t=1;
        q[t].r=sr,q[t].c=sc,q[t].s=0,t++,vis[sr][sc]=1;//此处写成q[t].r=sr,q[t].c=sc,q[t].s=1,t++;,查了好久
        while(h<t){
            r=q[h].r,c=q[h].c,s=q[h].s;
            if(r==er&&c==ec){
                flag=1;
                printf("%d\n",s);
                break;
            }
            for(k=0;k<4;k++){
                nr=r+next[k][0],nc=c+next[k][1];
                if(0<=nr&&nr<row&&0<=nc&&nc<col&&(a[nr][nc]=='.'||a[nr][nc]=='*')&&vis[nr][nc]==0){//此处写成if(0<=nr&&nr<row&&0<=nc&&nc<col&&a[nr][nc]=='.'&&vis[nr][nc]==0)查了好久好久
                    vis[nr][nc]=1,q[t].r=nr,q[t].c=nc,q[t].s=s+1,t++;
                }
            }
            h++;
        }
        if(flag==0)printf("-1\n");
    }
    return 0;
}
//1252 走迷宫
//样例通过,提交AC,2017-11-14 21:04
#include <stdio.h>
#include <string.h>
char a[50][50];
int n,m,vis[50][50],next[][2]={{1,0},{-1,0},{0,1},{0,-1}};
struct node{
    int r,c,s;
}q[3000];
void bfs(int sr,int sc,int er,int ec){
    int r,c,s,nr,nc,k,h,t;
    memset(vis,0,sizeof(vis));
    h=t=1;
    q[t].r=sr,q[t].c=sc,q[t].s=1,t++,vis[sr][sc]=1;
    while(h<t){
        r=q[h].r,c=q[h].c,s=q[h].s;
        if(r==er&&c==ec){
            printf("%d",s);
            break;
        }
        for(k=0;k<4;k++){
            nr=r+next[k][0],nc=c+next[k][1];
            if(0<=nr&&nr<n&&0<=nc&&nc<m&&a[nr][nc]=='.'&&vis[nr][nc]==0){
                vis[nr][nc]=1;
                q[t].r=nr,q[t].c=nc,q[t].s=s+1,t++;
            }
        }
        h++;//尽然漏了该句,没想法,应该是累了
    }
}
int main(){
    int i,j;
    scanf("%d%d",&n,&m);
    for(i=0;i<n;i++)scanf("%s",a[i]);
    bfs(0,0,n-1,m-1);
    return 0;
}
//1253 抓住那头牛
//POJ 3278 Catch That Cow
//http://blog.csdn.net/oliver341/article/details/41086603此文思路介绍不错,摘抄如下:
//每一个位置都有三种方式可以走即退一步(-1),进一步(+1),跳着走(*2),而不论走的是哪一种,
//走到下一步又同样会有三种方式,因此从第一步起将每一种可能(即走到的位置)存到队列里,
//利用队列先进先出的特性遍历每一种可能,一找到“牛”就停止说明所用时间最少。
//代码没有再看了,开始自己编
//在POJ里提交Runtime Error
//参考此文代码http://blog.csdn.net/clove_unique/article/details/50283307才AC
//有四个问题,1.牛在农夫左侧 2.0<=nx 3.nx<=100000一度以为nx可以为负数,nx可以超越100000 想想也是人不能越过牛
//4.需要对访问过的数据进行访问标识,该题AC十分困难 2017-11-18 22:16
//POJ AC在ybt竟然 全是 运行错误
//无奈之下,将100100全改成1001000,提交,全是 运行错误
//参考此文http://blog.csdn.net/clove_unique/article/details/50283307 AC代码进行研究
//多次提交未果后,突然间意识到错误所在,修改,提交AC 2017-11-18 23:33
#include <stdio.h>
#include <string.h>
int vis[100100],next[2]={-1,1};
struct node{
    int x,s;
}q[100100];
void bfs(int n,int k){
    int h,t,i,x,s,nx;
    h=t=1;
    q[t].x=n,q[t].s=0,t++,vis[n]=1;
    while(h<t){
        x=q[h].x;s=q[h].s;
        if(x==k){
            printf("%d",s);
            break;
        }
        for(i=0;i<2;i++){
            nx=x+next[i];
            if(0<=nx&&nx<=100000&&vis[nx]==0)//此处写成 if(vis[nx]==0&&0<=nx&&nx<=100000)多次提交未果
                vis[nx]=1,q[t].x=nx,q[t].s=s+1,t++;
        }
        nx=x*2;
        if(0<=nx&&nx<=100000&&vis[nx]==0)//此处写成 if(vis[nx]==0&&0<=nx&&nx<=100000)可能数组越界,故要先判断越界,在进行判断是否访问过
            vis[nx]=1,q[t].x=nx,q[t].s=s+1,t++;
        h++;
    }
}
int main(){
    int n,k;
    memset(vis,0,sizeof(vis));
    scanf("%d%d",&n,&k);
    if(k<n){//漏了该方向的处理
        printf("%d",n-k);
        return 0;
    }
    bfs(n,k);
    return 0;
}


//1254 走出迷宫
//样例通过,提交AC
#include <stdio.h>
#include <string.h>
int n,m,vis[110][110],next[][2]={{1,0},{-1,0},{0,1},{0,-1}};
char a[110][110];
struct node{
    int r,c,s;
}q[13000];
void bfs(int sr,int sc,int er,int ec){
    int k,r,c,s,nr,nc,h,t;
    memset(vis,0,sizeof(vis));
    h=t=1;//竟然会漏了这句
    q[t].r=sr,q[t].c=sc,q[t].s=0,t++,vis[sr][sc]=1;
    while(h<t){
        r=q[h].r,c=q[h].c,s=q[h].s;
        if(er==r&&ec==c){
            printf("%d",s);
            break;
        }
        for(k=0;k<4;k++){
            nr=r+next[k][0],nc=c+next[k][1];
            if(0<=nr&&nr<n&&0<=nc&&nc<m&&vis[nr][nc]==0&&a[nr][nc]=='.'){
                vis[nr][nc]=1;
                q[t].r=nr,q[t].c=nc,q[t].s=s+1,t++;
            }
        }
        h++;
    }    
}
int main(){
    int i,j,sr,sc,er,ec;
    scanf("%d%d",&n,&m);
    for(i=0;i<n;i++)scanf("%s",a[i]);
    for(i=0;i<n;i++)
        for(j=0;j<m;j++)
            if(a[i][j]=='S')sr=i,sc=j;
            else if(a[i][j]=='T')er=i,ec=j,a[i][j]='.';//请注意将'T'改成'.' 处理技巧
    bfs(sr,sc,er,ec);
    return 0;
}


//1255 迷宫问题

//POJ 3984 迷宫问题

//算最小步数简单,但打印路径,又是新问题。
//http://blog.csdn.net/qq1319479809/article/details/49805759扫了一眼文中代码,虽没看懂,但受到启发
//发现,自己的想法,与其思路只差了一点点。思维有提升。
//看了打印路径,发现起点是从(0, 0)开始的,本人代码是(1, 1)开始,为了统一,改代码,教训是,确认好输入输出再开始编码
//多次提交,出现编译错误,修改,提交AC。2017-11-14
#include <stdio.h>
#include <string.h>
int a[10][10],n=5,sr=0,sc=0,er,ec,vis[10][10],next[][2]={{1,0},{-1,0},{0,1},{0,-1}};//int a[10][10],n=5,sr=0,sc=0,er=n-1,ec=n-1,vis[10][10],next[][2]={{1,0},{-1,0},{0,1},{0,-1}};er=n-1,ec=n-1提交会出现编译错误
struct node{
    int r,c;
}q[50],b[10][10];//b[i][j]保存i,j的上层路径r,c
void print(int r,int c){
    if(r==sc-1&&r==sc-1)return;//此处写成 if(r==sc&&r==c)return;有失水准
    print(b[r][c].r,b[r][c].c);
    printf("(%d, %d)\n",r,c);    
}
int main(){
    int i,j,h,t,r,c,s,nr,nc,k;
    er=n-1,ec=n-1;//添加此句
    memset(vis,0,sizeof(vis));
    for(i=0;i<n;i++)
        for(j=0;j<n;j++)
            scanf("%d",&a[i][j]);
    h=t=1,q[t].r=sr,q[t].c=sc,t++,vis[sr][sc]=1,b[sr][sc].r=sr-1,b[sr][sc].c=sc-1;//此处写成 vis[r][c]=1
    while(h<t){
        r=q[h].r,c=q[h].c;
        if(r==er&&c==ec){
            print(r,c);
            break;
        }
        for(k=0;k<4;k++){
            nr=r+next[k][0],nc=c+next[k][1];
            if(0<=nr&&nr<n&&0<=nc&&nc<n&&vis[nr][nc]==0&&a[nr][nc]==0){//此处写成if(0<nr&&nr<n&&0<nc&&nc<n&&vis[nr][nc]==0&&a[nr][nc]==0)
                vis[nr][nc]=1,q[t].r=nr,q[t].c=nc,t++,b[nr][nc].r=r,b[nr][nc].c=c;
            }
        }
        h++;
    }
    return 0;
}

//1256 献给阿尔吉侬的花束
//写得过程中,小错误不断,样例通过后,提交AC 2017-11-15
#include <stdio.h>
#include <string.h>
int n,m,vis[210][210],next[][2]={{1,0},{-1,0},{0,1},{0,-1}};//此处写成 int a[210][210]查了好久
char a[210][210];//查找过程中,添加该句
struct node{
    int r,c,s;
}q[50000];
void bfs(int sr,int sc,int er,int ec){
    int h,t,i,j,r,c,s,nr,nc,k,flag=0;
    memset(vis,0,sizeof(vis));
    h=t=1;
    q[t].r=sr,q[t].c=sc,q[t].s=0,t++,vis[sr][sc]=1;
    while(h<t){
        r=q[h].r,c=q[h].c,s=q[h].s;
        if(r==er&&c==ec){
            flag=1;
            printf("%d\n",s);
            break;
        }
        for(k=0;k<4;k++){
            nr=r+next[k][0],nc=c+next[k][1];
            if(0<=nr&&nr<n&&0<=nc&&nc<m&&vis[nr][nc]==0&&a[nr][nc]=='.'){
                vis[nr][nc]=1;
                q[t].r=nr,q[t].c=nc,q[t].s=s+1,t++;
            }
        }
        h++;
    }
    if(flag==0)printf("oop!\n");
}
int main(){
    int t,i,j,sr,sc,er,ec;
    scanf("%d",&t);
    while(t--){
        scanf("%d%d",&n,&m);
        for(i=0;i<n;i++)scanf("%s",a[i]);
        for(i=0;i<n;i++)
            for(j=0;j<m;j++)
                if(a[i][j]=='S')sr=i,sc=j;
                else if(a[i][j]=='E')er=i,ec=j,a[i][j]='.';//请注意此处a[i][[j]='.'
        bfs(sr,sc,er,ec);
    }
    return 0;
}

//1257 Knight Moves

//POJ1915 Knight Moves

//提交,只有测试点5,6答案正确
//反复读代码都读不出问题,挺失望的,
//突然发现,L(4<=L<=300); q[10000]太小了,
//马上改成q[100000]; 提交AC 2017-11-15
#include <stdio.h>
#include <string.h>
int n,a[310][310],vis[310][310];
int next[][2]={{-2,1},{-1,2},{1,2},{2,1},{2,-1},{1,-2},{-1,-2},{-2,-1}};
struct node{
    int r,c,s;
}q[100000];//此处写成 q[10000]
void bfs(int sr,int sc,int er,int ec){
    int k,r,c,s,nr,nc,h,t;
    memset(vis,0,sizeof(vis));
    h=t=1;
    q[t].r=sr,q[t].c=sc,q[t].s=0,t++,vis[sr][sc]=1;
    while(h<t){
        r=q[h].r,c=q[h].c,s=q[h].s;
        if(er==r&&ec==c){
            printf("%d\n",s);
            break;
        }
        for(k=0;k<8;k++){
            nr=r+next[k][0],nc=c+next[k][1];
            if(0<=nr&&nr<n&&0<=nc&&nc<n&&vis[nr][nc]==0){
                vis[nr][nc]=1;
                q[t].r=nr,q[t].c=nc,q[t].s=s+1,t++;
            }
        }
        h++;
    }
}
int main(){
    int t,sr,sc,er,ec;
    scanf("%d",&t);
    while(t--){
        scanf("%d",&n);
        scanf("%d%d%d%d",&sr,&sc,&er,&ec);
        bfs(sr,sc,er,ec);
    }
    return 0;
}

2017-11-25 21:55 AC 该章节内容

阅读全文
1 0
原创粉丝点击