zoukankan      html  css  js  c++  java
  • UVA

    /*
      这题初看时容易被吓到,甚至连题目的意思都有些一知半解,但是沉下心仔细看几遍,就能发现也不是那么难,肯定不是难到完全想不出那种
      
      这题主要就是在考察完全二叉树
      
      收获:
      1. C 语言的格式控制非常好用,可以把一个已知位数的整数,其位数一步步分离出来,链接见 
      https://zhidao.baidu.com/question/493600982.html?qbl=relate_question_0&word=scanf%20%25nd
      
      但是如果想在C++中用呢?如果不用scanf的格式控制呢?
      我也在网上搜到了解决方法,见下个链接(该链接针对 char型数组):
      https://zhidao.baidu.com/question/1882344941428175148.html
      
      但是对于string类呢?
      对于string的话,我觉得可以采用 substr,不过string的函数总是会慢一些,毕竟 STL 很可能成为性能瓶颈
      
      所以,综上所述...其实还是用scanf的格式控制最优了!~ 写法简洁,还不容易出错!→_→
      

    */


    /*
      查阅过的有关链接:
      1、 完全二叉树,二叉树及其相关:
      https://www.zhihu.com/question/19809666 
      (
        这个链接提到了一个很有意思的问题,不同的书,对几种经典二叉树的定义,居然都是有区别的。我的一点小感受就是:
        如果要考研,务必将要考的学校的教材买来看看,说不定,他们的专业教材里,对于二叉树的相关类型术语,和我们自己用的专业书里,是完全不同的,这样做题时,可不就尴尬了,必错无疑啊!~
      )
      
      http://www.cnblogs.com/lxw0109/p/binary-tree.html
      //给出了简明的定义
      
      http://www.cnblogs.com/idorax/p/6441043.html
      //非常详细,想仔细弄懂应该看这个
      
      
      
      2、该题的题解:
      http://www.cnblogs.com/cute/p/3639970.html
      http://www.cnblogs.com/zyb993963526/p/6240125.html
      
      3、C语言格式控制之 %nd 控制整数位数
      %d是按照十进制整数形式输出,%nd中的n表示有效数字的位数;
      https://zhidao.baidu.com/question/493600982.html?qbl=relate_question_0&word=scanf%20%25nd
      
      https://zhidao.baidu.com/question/1882344941428175148.html
      
    */


    //法一
    #include <iostream>
    #include <cstdio>
    #include <string>
    #include <cmath>
    #define rep(i, n) for ( int i = 0; i < (n); i++ )
    using namespace std;
    
    int n, m, pos[1 << 10], x, s[1 << 10];
    
    int main ()
    {
    	int kase = 0;
    	while ( cin >> n && n )
    	{
    		string str;
    		getchar(); //吃掉数字 n 后面的空格
    		getline(cin, str); // 第二行数据是无用的,不影响输出结果,所以用 getline 吃掉就行了 
    		
    		rep(i, pow(2, n))
    		scanf("%1d", pos + i);
    		//pos数组存所有叶子节点里的数据
    		
    		cin >> m;
    		int t = 0;
    		
    		rep(i, m)
    		{
    			int l = 1; //l=1表示从根节点开始走
    			rep(j, n)
    			{
    				scanf("%1d", &x);
    				l = l * 2 + x;
    			} //x取0时表示向左走,x取1时表示向右左;因为节点i的左孩子的节点为 2i,右孩子的节点为 2i+1,有 l = l * 2 + x;
    			l = l - pow(2, n); //这是为了找到,当前查询到的叶子,在pos数组中的下标,然后将该位置里的值赋给s数组
    			s[t++] = pos[l];	
    		}
    		
    		cout << "S-Tree #" << ++kase << ":" << endl;
    		rep(i, m)
    		cout << s[i]; //最后将找到的所有叶子里的值一起输出即可
    		
    		cout << endl << endl;
    	}
    	return 0;
    }


    //法二
    //其实这题,自己多举几个例子,按照题意走几遍,就会发现:其实题目结果,只关乎于每一步是向左还是向右,和 x1 x2 x3 究竟以怎样的顺序排列,毫无关系
    //所以,每次输入的 "x1 x2 x3..."这行数据其实是干扰数据,这个我也是用了一段时间才发现 T^T
    
    #include <iostream>
    #include <string>
    #define rep(i, n) for ( int i = 0; i < (n); i++ )
    using namespace std;
    
    const int N = 10;
    int n;
    string leaves;
    
    int solve ( const string& s )
    {
    	int u = 1;
    	rep(i, n)
    	{
    		if (s[i] == '0') u = u * 2;
    		else u = u * 2 + 1;
    	}
    	return leaves[u - (1 << n)] - '0';
    }
    
    int main()
    {
    	int kase = 0;
    	while (cin >> n && n)
    	{
    		string s;
    		cout << "S-Tree #" << ++kase << ":
    ";
    		
    		rep(i, n) cin >> s;
    		
    		int m;
    		cin >> leaves >> m;
    		while (m--)
    		{
    			string str;
    			cin >> str;
    			cout << solve (str);
    		}
    		cout << endl << endl;
    		
    	}
    }


    一点题外话:

      眼下终于没有那么忙乱了,剩下的课内的作业和附加作业,和要看的教案什么的,只要每天写一点,还是能保证写完的...

      所以,我终于能够回来继续敲 uva 的题目啦,哈哈哈哈哈!~o(* ̄▽ ̄*)ブ

  • 相关阅读:
    可视化百分比数据,Excel图表展示小技巧
    巧用宏录制,轻松制作Excel简易查询小系统
    Excel也能制作电子印章,你见过吗?学会了职场不求人
    ​21个Shift组合快捷键,学会了想加班都难
    Excel中关于日期时间的小知识小技巧,你还记得多少?
    自动添加单元格边框,Excel有妙招,两个技巧任意选
    [asp.net] 通过JS实现对treeview控件的复选框单选控制。
    编译器把getset访问器编译成了方法get_method()/set_method()
    sql MERGE
    动态添加特性
  • 原文地址:https://www.cnblogs.com/mofushaohua/p/7789355.html
Copyright © 2011-2022 走看看