9.28noip模拟试题

1、栅栏迷宫

田野上搭建了一个黄金大神专用的栅栏围成的迷宫。幸运的是,在迷宫的边界上留出了两段栅栏作为迷宫的出口。更幸运的是,所建造的迷宫是一个“完美的”迷宫:即你能从迷宫中的任意一点找到一条走出迷宫的路。给定迷宫的宽W(1<=W<=38)及长H(1<=H<=100)。 2*H+1行,每行2*W+1的字符以下面给出的格式表示一个迷宫。然后计算从迷宫中最“糟糕”的那一个点走出迷宫所需的步数(就是从最“糟糕”的一点,走出迷宫的最少步数)。(即使从这一点以最优的方式走向最靠近的出口,它仍然需要最多的步数)当然了,黄金大神让你必须只会水平或垂直地在X或Y轴上移动,你不能从来不走对角线。每移动到一个新的方格算作一步(包括移出迷宫的那一步)这是一个W=5,H=3的迷宫:

+-+-+-+-+-+

|         |

+-+ +-+ + +

|     | | |

+ +-+-+ + +

| |     |

+-+ +-+-+-+

如上图的例子,栅栏的柱子只出现在奇数行或奇数列。每个迷宫只有两个出口。

PROGRAM NAME: maze

INPUT FORMAT:

(file maze.in)

第一行: W和H(用空格隔开)

第二行至第2*H+1行:  每行2*W+1个字符表示迷宫

OUTPUT FORMAT:

(file maze.out)

输出一个单独的整数,表示能保证牛从迷宫中任意一点走出迷宫的最小步数。

SAMPLE INPUT

5 3

+-+-+-+-+-+

|         |

+-+ +-+ + +

|     | | |

+ +-+-+ + +

| |     |

+-+ +-+-+-+

SAMPLE OUTPUT

9

Bfs(妈的把判重放到出队的时候就炸了....)

#include<iostream>
#include<cstdio>
#include<cstring>
#define maxn 310
using namespace std;
int n,m,head=1,tail,f[maxn][maxn];
char s[maxn][maxn],c;
struct node{
    int x,y,t;
}q[maxn*maxn];
int xx[4]={0,0,1,-1};
int yy[4]={1,-1,0,0};
int Bfs(){
    int mx=0;
    while(head<=tail){
        node p=q[head++];
        int x=p.x,y=p.y,t=p.t;
        mx=max(mx,t);
        for(int i=0;i<4;i++){
            int nx=x+xx[i];
            int ny=y+yy[i];
            if(nx>0&&nx<=n&&ny>0&&ny<=m&&f[nx][ny]==0&&s[nx][ny]==‘ ‘)
                f[nx][ny]=1,q[++tail]=(node){nx,ny,t+1};
        }
    }
    return mx;
}
int main()
{
    freopen("maze.in","r",stdin);
    freopen("maze.out","w",stdout);
    scanf("%d%d",&m,&n);c=getchar();
    m=m*2+1;n=n*2+1;
    for(int i=1;i<=n;i++)gets(s[i]+1);
    for(int i=1;i<=m;i++)
        if(s[1][i]==‘ ‘)q[++tail]=(node){1,i,0},f[1][i]=1;
    for(int i=1;i<=m;i++)
        if(s[n][i]==‘ ‘)q[++tail]=(node){n,i,0},f[n][i]=1;
    for(int i=1;i<=n;i++)
        if(s[i][1]==‘ ‘)q[++tail]=(node){i,1,0},f[i][1]=1;
    for(int i=1;i<=n;i++)
        if(s[i][m]==‘ ‘)q[++tail]=(node){i,m,0},f[i][m]=1;
    printf("%d\n",Bfs()+1>>1);
    return 0;
}

2、人偶师(alice.cpp/c/pas)

【题目描述】

n点m双向边的图,每个点有2个状态:开和关。每次操作改变一个点的状态,以及与其有边直接相连的点的状态。问开启所有点至少需要多少次操作。

【输入格式】

第一行2个整数n,m。

第二行n个整数,第i个数表示第i点的状态,0为关,1为开。

第3..m+2行,每行2个整数a,b,表示a和b直接相连,同一条边不会出现多次。

【输出格式】

第一行一个整数k表示最少的操作次数,所有数据保证至少有一组可行解。

第二行k个整数,表示操作的点的编号。

【样例输入】

4 3

1 1 0 0

2 3

1 3

2 4

【样例输出】

3

1 2 3

【数据范围】

对于30%的数据,1<=n<=10,0<=m<=40

对于60%的数据,1<=n<=30,0<=m<=100

对于100%的数据,1<=n<=40,0<=m<=500

暴力+剪枝70

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int n,m,num,head[50],c[50],s[50],r[50],f[50],sum=100,cr[50];
struct node{
    int v,pre;
}e[1010];
void Add(int from,int to){
    num++;e[num].v=to;
    e[num].pre=head[from];
    head[from]=num;
}
void Dfs(int now){
    int S=0;
    for(int i=1;i<=n;i++)
        if(f[i])S++;
    if(S>=sum)return;
    if(now==n+1){
        int flag=0;
        for(int i=1;i<=n;i++)
            if(!r[i]){
                flag=1;break;
            }
        if(flag==0){
            int cnt=0;
            for(int i=1;i<=n;i++)
                if(f[i])cnt++;
            if(cnt<sum){
                sum=cnt;cr[0]=0;
                for(int i=1;i<=n;i++)
                    if(f[i])cr[++cr[0]]=i;
            }
        }
        return;
    }
    for(int i=1;i<=n;i++)
        if(c[i]==s[i]&&r[i]==0)return;
    c[now]++;
    for(int i=head[now];i;i=e[i].pre)
        c[e[i].v]++;
    Dfs(now+1);
    for(int i=head[now];i;i=e[i].pre)
        c[e[i].v]--;
    r[now]=!r[now];f[now]=1;
    for(int i=head[now];i;i=e[i].pre)
        c[e[i].v]++,r[e[i].v]=!r[e[i].v];
    Dfs(now+1);
    for(int i=head[now];i;i=e[i].pre)
        c[e[i].v]--,r[e[i].v]=!r[e[i].v];
    c[now]--;r[now]=!r[now];f[now]=0;
}
int main()
{
    freopen("alice.in","r",stdin);
    freopen("alice.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++){
        scanf("%d",&r[i]);s[i]++;
    }
    int u,v;
    for(int i=1;i<=m;i++){
        scanf("%d%d",&u,&v);
        Add(u,v);Add(v,u);
        s[u]++;s[v]++;
    }
    Dfs(1);
    printf("%d\n",sum);
    for(int i=1;i<=cr[0];i++)
        printf("%d ",cr[i]);
    return 0;
}

正解分两段暴力+hash

3、交通(traffic.c/cpp/pas)

黄金大神国的首都位于hzwer河中的一座岛屿。一道上班的时候,成千上万辆汽车通过岛屿从西岸的住宅区(由桥连接岛的西部)到东岸的工业区(由桥连接岛的东部)。
    该岛类似于矩形,它的边平行于主方向。故可将它看作是笛卡尔坐标系中的一个A*B的矩形,它的对角分别为(0, 0)和(A, B)。
    岛上有n个交通节点(后宫建筑),编号为1…n,第i个节点坐标为(xi, yi)。如果一个节点的坐标为(0, y),它就位于岛的西岸。类似的,坐标为(A, y)的节点位于岛的东岸。各个节点由街道连接,每条街道用线段连接两个节点。街道有单向行驶或双向行驶之分。除端点外任意两条街道都没有公共点。也没有桥梁或者隧道。
    你不能对道路网络形状做任何其他假设。沿河岸的街道或节点可能没有入口或者出口街道。由于交通堵塞日趋严重,黄金大神想快速治理好他的国家,于是聘请你测试岛上当前的道路网是否足够。要求你写一个程序确定从岛的西岸的每个节点能够到达东岸的多少个节点。

【输入格式】

第1行包含4个整数n, m, A, B,分别表示hzwer市中心的节点数,街道数和岛屿的尺寸。
    接下来的n行,每行包含两个整数xi,yi (0≤xi≤A,0≤yi≤B),表示第i个节点的坐标。任意两个节点的坐标都不相同。
再往下的m行表示街道,每条街道用3个整数ci, di, ki(1≤ci, di≤n, ci≠di, ki∈{1,2}),表示节点ci、di有街道连接,如果ki=1,表示从ci到di的街道是单向的,否则,这条街道可以双向行驶。每个无序对{ci, di}最多出现1次。
    你可以假设西岸节点中至少有1个能够到达东岸的一些节点。

【输出格式】

为每个西岸节点输出1行,表示这个节点出发能够到达东岸的节点数目

【样例输入】

12 13 7 9

0 1

0 3

2 2

5 2

7 1

7 4

7 6

7 7

3 5

0 5

0 9

3 9

1 3 2

3 2 1

3 4 1

4 5 1

5 6 1

9 3 1

9 4 1

9 7 1

9 12 2

10 9 1

11 12 1

12 8 1

12 10 1

【样例输出】

4

4

0

2

【数据范围】

对于30%的数据,n, m≤6000

对于100%的数据,1≤n≤300000, 0≤m≤900000,1≤A,B≤10^9

暴力dfs

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 300010
using namespace std;
int n,m,A,B,num,head[maxn],f[maxn],p[maxn],tot,sum;
struct P{
    int o,Y,cnt;
}Xi[maxn];
struct node{
    int v,pre;
}e[maxn*3*2];
int init(){
    int x=0;char s=getchar();
    while(s<‘0‘||s>‘9‘)s=getchar();
    while(s>=‘0‘&&s<=‘9‘){x=x*10+s-‘0‘;s=getchar();}
    return x;
}
int cmp(const P &a,const P &b){
    return a.Y>b.Y;
}
void Add(int from,int to){
    num++;e[num].v=to;
    e[num].pre=head[from];
    head[from]=num;
}
void Dfs(int now){
    if(p[now]==1)sum++;
    for(int i=head[now];i;i=e[i].pre){
        int v=e[i].v;
        if(f[v])continue;
        f[v]=1;Dfs(v);
    }
}
int main()
{
    freopen("traffic.in","r",stdin);
    freopen("traffic.out","w",stdout);
    n=init();m=init();A=init();B=init();
    int x,y,z;
    for(int i=1;i<=n;i++){
        x=init();y=init();
        if(x==0)Xi[++tot]=(P){i,y,0};
        else if(x==A)p[i]=1;
    }
    for(int i=1;i<=m;i++){
        x=init();y=init();z=init();
        Add(x,y);if(z==2)Add(y,x);
    }
    for(int i=1;i<=tot;i++){
        memset(f,0,sizeof(f));
        sum=0;f[Xi[i].o]=1;
        Dfs(Xi[i].o);
        Xi[i].cnt=sum;
    }
    sort(Xi+1,Xi+1+tot,cmp);
    for(int i=1;i<=tot;i++)
        printf("%d\n",Xi[i].cnt);
    return 0;
}

时间: 2024-10-03 22:26:12

9.28noip模拟试题的相关文章

模拟试题B

模拟试题B 一.单项选择题(2′*8 =16′) 1.灰度等级为256级,分辨率为2048*1024的显示器,至少需要的帧缓存容量为( ) A)512KB B)1MB C)2MB D)3MB 2.在多形边面片的数量非常大的情况下,哪一个消隐算法速度最快? ( ) A)深度缓存算法(Z-Buffer) B)光线跟踪算法 C)画家算法 D)不确定 3.双线性光强插值法(Gouraud Shading)存在哪些问题?( ) A)光照强度在数值上不连续 B)生成多面体真实感图形效果差 C)生成曲面体真实

模拟试题C

模拟试题C 一.单项选择题(2′*14 =28′) 1.双线性法向插值法(Phong Shading)的优点是( ) A)法向计算精确 B)高光域准确 C)对光源和视点没有限制 D)速度较快 2.用编码裁剪法裁剪二维线段时,判断下列直线段采用哪种处理方法.假设直线段两个端点M.N的编码为1000和1001(按TBRL顺序)( ) A)直接舍弃 B)直接保留 C)对MN再分割求交 D)不能判断 3.下面哪个不是齐次坐标的特点( ) A)用n+1维向量表示一个n维向量 B)将图形的变换统一为图形的坐

计算机职称考试题库Internet模块操作练习模拟试题(一)

1.请为当前计算机添加连接到com1口的标准56000 bps调制解调器设备,要求不检测当前连接设备. 当前界面:开始à控制面板 方法一: 打开[电话和调整解调器选项]à[调整解调器]选项卡à[添加]按钮à选中[不要检测我的调制解调器设备……]à下一步à型号:标准 56000 bps 调制解调器à下一步à选定的端口:com1à下一步à完成 方法二: 添加新硬件à下一步à选择[是,我已经连接了此硬件]à下一步à列表拉到最后选择[添加新的硬件设备]à下一步à选择[安装我手动从列表选择的硬件(高级)]

2014年软考-信息技术处理员-模拟试题及答案【第一章】

51CTO学院,在软考备考季特别整理了"2014年软考信息技术处理员模拟试题及答案[汇总篇]",帮助各位学院顺利过关!更多软件水平考试辅导及试题,请关注51CTO学院-软考分类吧! 查看汇总:2014年软考-信息技术处理员-模拟试题及答案[汇总篇]  ●在计算机内部用来传送.存储.加工处理的数据或指令都是以____(1)_B___形式进行的. A. 十进制码 B.二进制码 C.八进制码 D.十六进制码 ●如果一个存储单元能存放一个字节,那么一个32KB的存储器共有____(2)_B__

2014年软考-信息技术处理员-模拟试题及答案【第二章】

51CTO学院,在软考备考季特别整理了"2014年软考信息技术处理员模拟试题及答案[汇总篇]",帮助各位学院顺利过关!更多软件水平考试辅导及试题,请关注51CTO学院-软考分类吧! 查看汇总:2014年软考-信息技术处理员-模拟试题及答案[汇总篇]  ●计算机网络的主要目标是实现____(16 )__C__. A.数据处理 B.文献检索 C.资源共享和信息传输 D.信息传输 ●Internet上,访问Web网站时用的工具是浏览器.下列____(17 )_A___就是目前常用的Web浏览

2014年软考-信息技术处理员-模拟试题及答案【第三章】

51CTO学院,在软考备考季特别整理了"2014年软考信息技术处理员模拟试题及答案[汇总篇]",帮助各位学院顺利过关!更多软件水平考试辅导及试题,请关注51CTO学院-软考分类吧! 查看汇总:2014年软考-信息技术处理员-模拟试题及答案[汇总篇]  ●备注视图中的注释信息在文稿演示时____(31)__B__. A.会显示 B.不会显示 C.显示一部分 D.显示标题 ●Access 2000关系数据库是____(32)_D___的集合. A.数据 B.数据库对象 C.表 D.关系 ●

2014年软考-信息技术处理员-模拟试题及答案【第四章】

51CTO学院,在软考备考季特别整理了"2014年软考信息技术处理员模拟试题及答案[汇总篇]",帮助各位学院顺利过关!更多软件水平考试辅导及试题,请关注51CTO学院-软考分类吧! 查看汇总:2014年软考-信息技术处理员-模拟试题及答案[汇总篇]  ●Office家族为用户提供了各种不同类型的模板.扩展名为.mdz的模板是____(41)D____中的模板. A.Word B.Excel C.PowerPoint D.Access ●在Excel中,选取一行单元格的方法是____(4

2014年软考-信息技术处理员-模拟试题及答案【第五章】

51CTO学院,在软考备考季特别整理了"2014年软考信息技术处理员模拟试题及答案[汇总篇]",帮助各位学院顺利过关!更多软件水平考试辅导及试题,请关注51CTO学院-软考分类吧! 查看汇总:2014年软考-信息技术处理员-模拟试题及答案[汇总篇]  ●管理信息系统科学的3要素是系统的观点.数学的方法和____(51)A____. A.计算机的应用 B.计算机科学 C.计算机理论 D.计算机方法 ●知识产权可分为:____(52)___C_两类. A.农业产权和著作权 C.工业产权和著

2014年软考-信息技术处理员-模拟试题及答案【第六章】

51CTO学院,在软考备考季特别整理了"2014年软考信息技术处理员模拟试题及答案[汇总篇]",帮助各位学院顺利过关!更多软件水平考试辅导及试题,请关注51CTO学院-软考分类吧! 查看汇总:2014年软考-信息技术处理员-模拟试题及答案[汇总篇]  ●Access数据库的类型是____(61)_C___. A.层次数据库 B.网状数据库 C.关系数据库 D.面向对象数据库 ●在Word文档操作中,经常利用____(62)_C___操作过程相互配合,用以将一段文本内容移到另一处. A.