foj 1055 赋值问题 &&1723 我就不信你能找得到 &&1063 三维扫描

Problem 1055 赋值问题

Accept: 1255    Submit: 6950
Time Limit: 1000 mSec    Memory Limit : 32768 KB

 Problem Description

在很多程序设计语言中,忘记给变量赋初值的错误常令人头疼。请编程求出含N(0≤N≤100)行的程序段运行以后有哪些变量中有确定的值。 在下面的问题中,最开始仅有变量a中有确定的值。变量为单个小写字母,每行恰好有三个字符,中间一个是赋值运算符'='。

 Input

输入有多组数据,每组数据的第一行有一个整数N,表示程序段的行数。以下N行,每行3个字符,为一条语句。最后一组数据N=-1表示输入结束,不需要处理。

 Output

对每一组数据输出一行结果,按字母表顺序给出所有有确定值的变量名。如果没有变量有确定的值,输出none。

 Sample Input

4
b=a
c=d
d=b
e=f
-1

 Sample Output

a b d

这道题是端午专场比赛的时候做的,当时数据有限,没有理解清楚题的意思,这句话“最开始仅有变量a中有确定的值”,意思是输入0的时候也输出的是a,不是none。题虽然很水,但是没有做出来!这里代码,可以好好理解一下题意。

#include<stdio.h>
#include<string.h>
int main()
{
    int n,i,vis[26];
    char a,b,c;;
    while(scanf("%d",&n))
    {
        if(n==-1)
        break;
        memset(vis,0,sizeof(vis));
        vis[0]=1;
        for(i=0;i<n;i++)
        {
            getchar();
            scanf("%c%c%c",&a,&b,&c);
            vis[a-'a']=vis[c-'a'];
        }
        int flag=1;int sum=0;
        for(i=0;i<26;i++)
        {
            if(vis[i])
            {
                sum++;
                if(sum==1)
                    printf("%c",i+'a');
                else
                    printf(" %c",i+'a');
                flag=0;
            }
        }
        if(flag==1) printf("none");
        printf("\n");
    }
}

F - 我就不信你能找得到
Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u

Description

yayamao是只很笨的猫。它只认识偶数,它认为成双成对才是完美的。所以对于yayamao来说偶数是可数的,奇数是不可数的。
另外,yayamao它总是想写乱七八糟的问题,可是自己又很笨,不会做。这不,这只傻猫又出了道乱七八糟的题目,只能请教你们来做做喽。
yayamao面前有N个食物,每一个食物都有一种代号V。现在yayamao要开始整理这么多吃的东东了,就是说yayamao想要统计同一种食物一共有多少个。
同时yayamao被告知这N个食物中仅有两种食物是不可数的。yayamao的目的很简单,能不能帮他找出这两种不可数的食物?
很简单吧?是不是认为yayamao很笨啊?这么简单都不会,还等什么呢?
Kill it in seconds...

Input

第一行一个T(1<=T<=10),代表有T组测试数据。
每组数据的第一行是一个N(N<=10^6),代表yayamao面前有N个食物。
接下来的一行有N个整数,第i个整数代表第i个食物的种类代号V[i]  (0<=V[i]<2^64)

Output

每组数据输出两个数A和B,A<B, 表示A,B两种食物是不可数的。A,B中间隔一个空格,行末要换行。

Sample Input

2
10
1 1 1 2 2 2 3 3 4 4
20
0 1 0 1 2 3 4 2 3 4 65535 65535 65535 789456123 789456123 789456123 10 10 10 10

Sample Output

1 2
65535 789456123
这也是比赛的题目,位运算中相当简单的一个异或的用法,这道题出的相当的巧妙。 两个数的异或的值是什么值呢?他是这两个数的二进制的差的绝对值!
交换两个整数的值而不必用第三个参数,比如
a = 9;
b = 11;

a=a^b; 1001^1011=0010
b=b^a; 1011^0010=1001
a=a^b;  0010^1001=1011

a = 11;
b = 9;
这里就是这个的一个运用,两个相同的数异或之后为0,只剩下两个为奇数次数的数的异或,在运用上面的方法把他们取出来就OK,没有想到啊、、、位运算在编程中相当的有用,简单且有效,得找时间好好的学习一下。上代码:
#include<stdio.h>
#include<algorithm>
using namespace std;
__int64 a[1000002];
int main()
{
    __int64 m,n,i,j,s,k,t;
    scanf("%I64d",&t);
    while(t--)
    {
        scanf("%I64d",&n);
        s=0;
        for(i=0;i<n;i++)
        {
           scanf("%I64d",&a[i]);
           s^=a[i];
        }
        m=s,k=s,j=0;
        while(m)
        {
           j++;
           if(m%2==1) break;
           m/=2;
        }
        j--;
        for(i=0;i<n;i++)
          if(a[i]>>j&1)
            s^=a[i];
        k^=s;
        printf("%I64d %I64d\n",min(k,s),max(k,s));
    }
    return 0;
}

首先可以直接用递归搜索进行,关键点是对搜索边界的控制上,代码:
#include <cstdio>
#include <cstring>
int map[55][55][55];
bool low[55][55][55];
    int l,w,h,m,count;
int ac(int x,int y,int z)
{
    if(x>=0 && x<l && y>=0 && y<w && z>=0 && z<h && low[x][y][z])
        return 1;
    else
        return 0;
}
void map_search(int i,int j,int k,int m)
{
    if(ac(i,j,k+1) && map[i][j][k+1]<=(map[i][j][k]+m) && map[i][j][k+1]>=(map[i][j][k]-m))
    {
        low[i][j][k+1]=false;
        map_search(i,j,k+1,m);
    }
    if(ac(i,j,k-1)  && map[i][j][k-1]<=(map[i][j][k]+m) && map[i][j][k-1]>=(map[i][j][k]-m))
    {
        low[i][j][k-1]=false;
        map_search(i,j,k-1,m);
    }
    if(ac(i,j+1,k)  && map[i][j+1][k]<=(map[i][j][k]+m) && map[i][j+1][k]>=(map[i][j][k]-m))
    {
        low[i][j+1][k]=false;
        map_search(i,j+1,k,m);
    }
    if(ac(i,j-1,k)  && map[i][j-1][k]<=(map[i][j][k]+m) && map[i][j-1][k]>=(map[i][j][k]-m))
    {
        low[i][j-1][k]=false;
        map_search(i,j-1,k,m);
    }
    if(ac(i+1,j,k)  && map[i+1][j][k]<=(map[i][j][k]+m) && map[i+1][j][k]>=(map[i][j][k]-m))
    {
        low[i+1][j][k]=false;
        map_search(i+1,j,k,m);
    }
    if(ac(i-1,j,k)  && map[i-1][j][k]<=(map[i][j][k]+m) && map[i-1][j][k]>=(map[i][j][k]-m))
    {
        low[i-1][j][k]=false;
        map_search(i-1,j,k,m);
    }
}
int main()
{

    while(scanf("%d%d%d",&l,&w,&h)!=EOF)
    {
        memset(low,true,sizeof(low));
        memset(map,0,sizeof(map));
        count=0;
        scanf("%d",&m);
        for(int i=0;i<l;i++)
        {
            for(int j=0;j<w;j++)
            {
                for(int k=0;k<h;k++)
                {
                    scanf("%d",&map[i][j][k]);
                }
            }
        }
        for(int i=0;i<l;i++)
        {
            for(int j=0;j<w;j++)
            {
                for(int k=0;k<h;k++)
                {
                    if(low[i][j][k])
                    {
                        count++;
                        low[i][j][k]=false;
                        map_search(i,j,k,m);
                        //printf("yes\n");
                     }
                }
            }
        }
        printf("%d\n",count);
    }
    return 0;
}

很标准的一道广搜水题、、、只要按着广搜的模板敲下来就行了、要注意的是对搜索边界的控制,否则会RE。代码:
#include <cstdio>
#include <cstring>
#include <queue>
#include <cmath>
using namespace std;

struct Node
{
    int x,y,z;
};
int map[55][55][55];
bool lis[55][55][55];
int m;
int fang[6][3]={{1,0,0},{-1,0,0},{0,1,0},{0,-1,0},{0,0,1},{0,0,-1}};
queue<Node>v;
int x,y,z,l,w,h,count;
int ac(int x,int y,int z)
{
    if(x>=0 && x<l && y>=0 && y<w && z>=0 && z<h && lis[x][y][z])
    return 1;
    else
    return 0;
}
int main()
{

    Node aa,bb;
    while(~scanf("%d%d%d",&l,&w,&h))
    {
        scanf("%d",&m);
        memset(map,-10000,sizeof(map));
        memset(lis,true,sizeof(lis));
        for(int i=0;i<l;i++)
            for(int j=0;j<w;j++)
                for(int k=0;k<h;k++)
                   scanf("%d",&map[i][j][k]);
        count=0;
        while(!v.empty())
            v.pop();
        for(int i=0;i<l;i++)
        {
            for(int j=0;j<w;j++)
            {
                for(int k=0;k<h;k++)
                {
                    if(lis[i][j][k])
                    {
                        aa.x=i; aa.y=j; aa.z=k;
                        v.push(aa);
                        while(!v.empty())
                        {
                            aa=v.front();
                            v.pop();
                            for(int ii=0;ii<6;ii++)
                            {
                                bb.x=aa.x+fang[ii][0];
                                bb.y=aa.y+fang[ii][1];
                                bb.z=aa.z+fang[ii][2];
                                if(ac(bb.x,bb.y,bb.z) && map[bb.x][bb.y][bb.z] <= map[aa.x][aa.y][aa.z]+m && map[bb.x][bb.y][bb.z]>=map[aa.x][aa.y][aa.z]-m)
                                {
                                    lis[bb.x][bb.y][bb.z]=false;
                                    v.push(bb);
                                }
                            }
                        }
                        count++;
                    }
                }
            }
        }
        printf("%d\n",count);
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值