当前位置:  编程技术>综合
本页文章导读:
    ▪数据结构 uva 101 - The Blocks Problem        题目链接: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=37   题目意思:     开始给定编号为0-n的数分别在1-n栈里,然后执行四种操作.........
    ▪扩展ImageView使可旋转      继承ImageView,增加angle属性,重写OnMeasure和OnDraw方法 package com.upon.common.view; import android.content.Context; import android.content.res.TypedArray; import android.graphics.Canvas; import android.util.AttributeSet; import android.w.........
    ▪linuxthreads管理线程原理详解       linuxthreads管理线程原理详解 为什么A程序创建了10个线程, 但是ps时却会出现11个A进程了. 因为linuxthreads自动创建了一个管理线程.  当程序开始运行时, 并没有管理线程存在(因为尽管程序已.........

[1]数据结构 uva 101 - The Blocks Problem
    来源: 互联网  发布时间: 2013-11-10

 

题目链接:

http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=37

 

题目意思:

    开始给定编号为0-n的数分别在1-n栈里,然后执行四种操作,求最后这n个栈中的数据情况

    四种操作规则:

    1.move a onto b

把a所在栈a上面的数据回归到初始状态,把b所在栈b上面的数据回归到初始状态,然后把a放到b上面

    2.move a over b

把a所在栈a上面的数据回归到初始状态,然后把a放到b上面

    3.pile a onto b

把b所在栈b上面的数据回归到初始状态,然后把a所在栈包括a元素在内的所有元素按在该栈的顺序不变,全部移到b所在的栈上

   4.pile a over b

把a所在栈包括a元素在内的所有元素按在该栈的顺序不变,全部移到b所在的栈上

 

解题思路:

   用栈来模拟执行过程,注意数据为0-n-1,回归的时候注意加一。细节详见代码

 

代码:

#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include<algorithm>
#include<vector>
#include<map>
#define eps 1e-6
#define INF (1<<20)
#define PI acos(-1.0)
using namespace std;


struct Stack  //模拟栈
{
    int top;
    int save[100];

    int pop()
    {
        return save[top--];
    }

    int push(int n)
    {
        ++top;

        return save[top]=n;
    }

    bool empty()
    {
        if(top==0)
            return true;
        return false;
    }

    void clear()
    {
        top=0;
    }

    int finda(int a)
    {
        for(int i=1;i<=top;i++)  //在栈中找数的位置
            if(save[i]==a)
                return i;
        return 0;
    }

};

Stack stack[100];

int n;

int find(int a)  //找数a属于哪一个栈
{
    for(int i=1;i<=n;i++)
    {

        int j=stack[i].finda(a);

        if(j)
           return i;
    }

}

void removeup(int local,int a) //将a上面的元素全部回归
{
    //while(stack[local].save[stack[local].top]!=a)


    int limit=stack[local].finda(a);

    for(int i=limit+1;i<=stack[local].top;i++)
    {
        int temp=stack[local].save[i];

        stack[temp+1].push(temp);
       /* stack[temp+1].clear();      //注意回归时应与加一对应,坑死了
        stack[temp+1].push(temp);*/
    }

    stack[local].top=limit;  //注意现在该栈的元素个数

    return ;
}

void removewhole(int locala,int a,int localb) //将a所在栈包括a以及以上的所有元素全部按顺序移到b所在栈上
{

    int i=stack[locala].finda(a);  //先找到a的位置
    int temp=i;

    for(;i<=stack[locala].top;i++)
    {
        stack[localb].push(stack[locala].save[i]);

    }
    stack[locala].top=temp-1; //注意更新栈a的元素个数



    return ;
}


void moveonto(int a,int b)
{
    int tempa=find(a),tempb=find(b);

    if(tempa==tempb)
        return ;

    removeup(tempa,a);
    removeup(tempb,b);

    stack[tempb].push(a);  //将a移向b
    stack[tempa].top--;
    return ;
}

void moveover(int a,int b)
{
    int tempa=find(a),tempb=find(b);

    if(tempa==tempb)
        return ;

    removeup(tempa,a);
    stack[tempb].push(a);  //将a移向b
    stack[tempa].top--;
    return ;
}

void pileonto(int a,int b)
{
    int tempa=find(a),tempb=find(b);

    if(tempa==tempb)
        return ;

    removeup(tempb,b);
    removewhole(tempa,a,tempb);
    return ;
}

void pileover(int a,int b)
{
    int tempa=find(a),tempb=find(b);

    if(tempa==tempb)
        return ;

    removewhole(tempa,a,tempb);
}

void print()
{
    for(int i=1;i<=n;i++)
        {
            printf("%d:",i-1);
            if(!stack[i].empty())
            {
                for(int j=1;j<=stack[i].top;j++)
                    printf(" %d",stack[i].save[j]);

            }
            putchar('\n');
        }
    return ;
}

int main()
{
    int a,b;
    char com1[20],com2[20];

    while(cin>>n)
    {
        for(int i=1;i<=n;i++)
        {
            stack[i].clear();
            stack[i].push(i-1);
        }
        //print();

        while(cin>>com1&&strcmp(com1,"quit"))
        {
            scanf("%d%s%d",&a,com2,&b);
            if(a==b)
                continue;

            if(strcmp(com1,"move")==0)
            {
                if(strcmp(com2,"onto")==0)
                    moveonto(a,b);
                else
                    moveover(a,b);
            }
            else
            {
                if(strcmp(com2,"onto")==0)
                    pileonto(a,b);
                else
                    pileover(a,b);
            }
           // print();

        }
        print();


    }

    return 0;
}



 

 

 

 

作者:cc_again 发表于2013-1-13 14:47:56 原文链接
阅读:35 评论:0 查看评论

    
[2]扩展ImageView使可旋转
    来源:    发布时间: 2013-11-10
继承ImageView,增加angle属性,重写OnMeasure和OnDraw方法
package com.upon.common.view;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.util.AttributeSet;
import android.widget.ImageView;

import com.upon.xxxx.R;

public class UponRotateImageView extends ImageView {

	private int mAngle;

	public UponRotateImageView(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
		loadAttributes(context, attrs);
	}

	public UponRotateImageView(Context context, AttributeSet attrs) {
		super(context, attrs);
		loadAttributes(context, attrs);
	}

	public UponRotateImageView(Context context) {
		super(context);
	}

	private void loadAttributes(Context context, AttributeSet attrs) {
		TypedArray arr = context.obtainStyledAttributes(attrs, R.styleable.RotateImageView);
		mAngle = arr.getInteger(R.styleable.RotateImageView_angle, 0);
		arr.recycle();
	}

	public int getAngle() {
		return mAngle;
	}

	public void setAngle(int angle) {
		mAngle = angle;
	}

	@Override
	protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
		int w = getDrawable().getIntrinsicWidth();
		int h = getDrawable().getIntrinsicHeight();
		double a = Math.toRadians(mAngle);

		int width = (int) (Math.abs(w * Math.cos(a)) + Math.abs(h * Math.sin(a)));
		int height = (int) (Math.abs(w * Math.sin(a)) + Math.abs(h * Math.cos(a)));

		setMeasuredDimension(width, height);
		super.onMeasure(widthMeasureSpec, heightMeasureSpec);
	}

	@Override
	protected void onDraw(Canvas canvas) {
		canvas.save();
		canvas.rotate(mAngle % 360, getWidth() / 2, getHeight() / 2);
		getDrawable().draw(canvas);
		canvas.restore();
	}
}

attrs.xm文件中增加angle属性

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="RotateImageView">
        <attr name="angle" format="integer" />
    </declare-styleable>

</resources>


使用UponRotateImageView
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:upon="http://schemas.android.com/apk/res/com.upon.xxxx"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" >

    <com.upon.common.view.UponRotateImageView
        android:id="@+id/bkg_img"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="/blog_article/@drawable/conquer_nation_bkg/index.html"
        upon:angle="45" />

</RelativeLayout>


已有 0 人发表留言,猛击->>这里<<-参与讨论


ITeye推荐
  • —软件人才免语言低担保 赴美带薪读研!—




    
[3]linuxthreads管理线程原理详解
    来源: 互联网  发布时间: 2013-11-10

linuxthreads管理线程原理详解

为什么A程序创建了10个线程, 但是ps时却会出现11个A进程了. 因为linuxthreads自动创建了一个管理线程. 
当程序开始运行时, 并没有管理线程存在(因为尽管程序已经链接了pthread库, 但是未必会使用多线程). 
程序第一次调用pthread_create时, linuxthreads发现管理线程不存在, 于是创建这个管理线程. 这个管理线程是进程中的第一个线程(主线程)的儿子.
然后在pthread_create中, 会通过pipe向管理线程发送一个命令, 告诉它创建线程. 即是说, 除主线程外, 所有的线程都是由管理线程来创建的, 管理线程是它们的父亲.

【一个线程退出】
于是, 当任何一个子线程退出时, 管理线程将收到SIGUSER1信号(这是在通过clone创建子线程时指定的). 管理线程在对应的sig_handler中会判断子线程是否正常退出, 如果不是, 则杀死所有线程, 然后自杀.
那么, 主线程怎么办呢? 主线程是管理线程的父亲, 其退出时并不会给管理线程发信号. 于是, 在管理线程的主循环中通过getppid检查父进程的ID号, 如果ID号是1, 说明父亲已经退出, 并把自己托管给了init进程(1号进程). 这时候, 管理线程也会杀掉所有子线程, 然后自杀.

可见, 线程的创建与销毁都是通过管理线程来完成的, 于是管理线程就成了linuxthreads的一个性能瓶颈. 
创建与销毁需要一次进程间通信, 一次上下文切换之后才能被管理线程执行, 并且多个请求会被管理线程串行地执行.


【总结】
当一个线程退出时:
1.正常退出========  其他线程继续运行。
2.非正常退出======  进程结束。

当进程退出时:
进程和所有线程一起退出。
=======================================================
父子进程中若父进程退出,而不等待子进程,子进程会变为僵尸进程。

作者:lmh12506 发表于2013-1-13 15:42:09 原文链接
阅读:0 评论:0 查看评论

    
最新技术文章:
▪error while loading shared libraries的解決方法    ▪版本控制的极佳实践    ▪安装多个jdk,多个tomcat版本的冲突问题
▪简单选择排序算法    ▪国外 Android资源大集合 和个人学习android收藏    ▪.NET MVC 给loading数据加 ajax 等待loading效果
▪http代理工作原理(3)    ▪关注细节-TWaver Android    ▪Spring怎样把Bean实例暴露出来?
▪java写入excel2007的操作    ▪http代理工作原理(1)    ▪浅谈三层架构
▪http代理工作原理(2)    ▪解析三层架构……如何分层?    ▪linux PS命令
▪secureMRT Linux命令汉字出现乱码    ▪把C++类成员方法直接作为线程回调函数    ▪weak-and算法原理演示(wand)
▪53个要点提高PHP编程效率    ▪linux僵尸进程    ▪java 序列化到mysql数据库中
▪利用ndk编译ffmpeg    ▪活用CSS巧妙解决超长文本内容显示问题    ▪通过DBMS_RANDOM得到随机
▪CodeSmith 使用教程(8): CodeTemplate对象    ▪android4.0 进程回收机制    ▪仿天猫首页-产品分类
▪从Samples中入门IOS开发(四)------ 基于socket的...    ▪工作趣事 之 重装服务器后的网站不能正常访...    ▪java序列化学习笔记
▪Office 2010下VBA Addressof的应用    ▪一起来学ASP.NET Ajax(二)之初识ASP.NET Ajax    ▪更改CentOS yum 源为163的源
▪ORACLE 常用表达式    ▪记录一下,AS3反射功能的实现方法    ▪u盘文件系统问题
▪java设计模式-观察者模式初探    ▪MANIFEST.MF格式总结    ▪Android 4.2 Wifi Display核心分析 (一)
▪Perl 正则表达式 记忆方法    ▪.NET MVC 给loading数据加 ajax 等待laoding效果    ▪java 类之访问权限
▪extjs在myeclipse提示    ▪xml不提示问题    ▪Android应用程序运行的性能设计
▪sharepoint 2010 自定义列表启用版本记录控制 如...    ▪解决UIScrollView截获touch事件的一个极其简单有...    ▪Chain of Responsibility -- 责任链模式
▪运行skyeye缺少libbfd-2.18.50.0.2.20071001.so问题    ▪sharepoint 2010 使用sharepoint脚本STSNavigate方法实...    ▪让javascript显原型!
▪kohana基本安装配置    ▪MVVM开发模式实例解析    ▪sharepoint 2010 设置pdf文件在浏览器中访问
▪spring+hibernate+事务    ▪MyEclipse中文乱码,编码格式设置,文件编码格...    ▪struts+spring+hibernate用jquery实现数据分页异步加...
▪windows平台c++开发"麻烦"总结    ▪Android Wifi几点    ▪Myeclipse中JDBC连接池的配置
▪优化后的冒泡排序算法    ▪elasticsearch RESTful搜索引擎-(java jest 使用[入门])...    ▪MyEclipse下安装SVN插件SubEclipse的方法
▪100个windows平台C++开发错误之七编程    ▪串口转以太网模块WIZ140SR/WIZ145SR 数据手册(版...    ▪初识XML(三)Schema
▪Deep Copy VS Shallow Copy    ▪iphone游戏开发之cocos2d (七) 自定义精灵类,实...    ▪100个windows平台C++开发错误之八编程
▪C++程序的内存布局    ▪将不确定变为确定系列~Linq的批量操作靠的住...    ▪DIV始终保持在浏览器中央,兼容各浏览器版本
▪Activity生命周期管理之三——Stopping或者Restarti...    ▪《C语言参悟之旅》-读书笔记(八)    ▪C++函数参数小结
▪android Content Provider详解九    ▪简单的图片无缝滚动效果    ▪required artifact is missing.
▪c++编程风格----读书笔记(1)    ▪codeforces round 160    ▪【Visual C++】游戏开发笔记四十 浅墨DirectX教程...
▪【D3D11游戏编程】学习笔记十八:模板缓冲区...    ▪codeforces 70D 动态凸包    ▪c++编程风格----读书笔记(2)
▪Android窗口管理服务WindowManagerService计算Activity...    ▪keytool 错误: java.io.FileNotFoundException: MyAndroidKey....    ▪《HTTP权威指南》读书笔记---缓存
▪markdown    ▪[设计模式]总结    ▪网站用户行为分析在用户市场领域的应用
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3