摘要:地址:http://poj.org/problem?id=1017翻译:http://poj.grids.cn/practice/1017/思路:贪心算法 , 其实这道题的关键就是要解决2*2规格的。处理的时候要注意向上调整题目分析:有6*6规格的箱子和一大堆木块 用多少箱子可以把木块都装下先放大的6*6 5*5 4*4 都需要新开箱子 每4个3*3需要开个新箱子 算下剩多少2*2和1*1的 如果不够再开箱子如果一个箱子中放置了一个6*6的产品,则此箱子中无法放置其它产品;若放置一个5*5的产品,则此箱子中还可放置11个1*1的产品;若放4*4的产品,还可放5个2*2的产品。若放置3*3的产品
阅读全文
摘要:地址:http://poj.org/problem?id=3767题目分析:由于战争,一个商人想从城市1,回到自己的家城市2,其中城市1始终是由领导1,城市2始终由领导2,其中,商人回家的路中只能有一条路上连接由两个领导领导的城市,还有就是给出的路上双向的,也就是如果城市1能到城市2,那么城市2也同样能到城市1,这是关键。由于这个题中从1类城市走到2类城市后就不能再回去,只能穿过一次,所以先存为双向路,后面再根据不同类型的城市,把双向路变为单向路N个城市,城市编号为1,2,3,……NM条路,路为双向路。 提供每条路的长度及端点城市编号,每两个城市之间直接连通的路最多一条。这N个城市分为两个集合
阅读全文
摘要:地址:http://poj.org/problem?id=1979思路:递归题目分析:输入:包括多个数据集合。每个数据集合的第一行是两个整数W和H,分别表示x方向和y方向瓷砖的数量。W和H都不超过20。在接下来的H行中,每行包括W个字符。每个字符表示一块瓷砖的颜色,规则如下‘.’:黑色的瓷砖‘#’:白色的瓷砖‘@’:黑色的瓷砖,并且你站在这块瓷砖上。该字符在每个数据集合中唯一出现一次当在一行中读入的是两个零时,表示输入结束。输出:对每个数据集合,分别输出一行,显示你从初始位置出发能到达的瓷砖数(记数时包括初始位置的瓷砖)算法分析:设f(x,y)为从点(x,y)出发能够走过的黑瓷砖总数,则 f(
阅读全文
摘要:地址:http://poj.org/problem?id=1664题目分析:输入:m个苹果,n个盘子,问多少种不同放法.算法分析:设f(m,n) 为m个苹果,n个盘子的放法数目,则先对n作讨论,当n>m:必定有n-m个盘子永远空着,去掉它们对摆放苹果方法数目不产生影响。即 if(n>m) f(m,n) = f(m,m) 当n<=m:不同的放法可以分成两类:1、有至少一个盘子空着,即相当于f(m,n) = f(m,n-1); 或2、所有盘子都有苹果,相当于可以从每个盘子中拿掉一个苹果,不影响不同放法的数目,即 f(m,n) = f(m-n,n). 而总的放苹果的放法数目等于两者
阅读全文
摘要:地址:http://poj.org/problem?id=1164问题描述:图1是一个城堡的地形图。请你编写一个程序,计算城堡一共有多少房间最大的房间有多大城堡被分割成m´n(m≤50,n≤50)个方块,每个方块可以有0~4面墙输入:程序从标准输入设备读入数据。第一行是两个整数,分别是南北向、东西向的方块数。在接下来的输入行里,每个方块用一个数字(0≤p≤50)描述。用一个数字表示方块周围的墙,1表示西墙,2表示北墙,4表示东墙,8表示南墙。每个方块用代表其周围墙的数字之和表示。城堡的内墙被计算两次,方块(1,1)的南墙同时也是方块(2,1)的北墙。输入的数据保证城堡至少有两个房间输
阅读全文
摘要:地址:http://poj.org/problem?id=1011问题描述:乔治拿来一组等长的木棒,将它们随机地裁断,使得每一节木棒的长度都不超过50个长度单位。然后他又想把这些木棒恢复到为裁截前的状态,但忘记了木棒的初始长度。请你设计一个程序,帮助乔治计算木棒的可能最小长度。每一节木棒的长度都用大于零的整数表示输入:由多个案例组成,每个案例包括两行。第一行是一个不超过64的整数,表示裁截之后共有多少节木棒。第二行是经过裁截后,所得到的各节木棒的长度。在最后一个案例之后,是零。输出:为每个案例,分别输出木棒的可能最小长度。每个案例占一行。思路1:题意: 给你n 木棍碎片,要求还原原木棍,且原木
阅读全文
摘要:1 #include<stdio.h> 2 #include <string.h> 3 #define MAX_LEN 60 4 5 unsigned aNum[MAX_LEN+10];//存放倒过来的大数,从低位开始相乘 6 unsigned aRes[MAX_LEN+10];//存放相乘后的大数 7 unsigned aFlag[MAX_LEN+10];// 看是否匹配 8 9 int main()10 {11 char sNum[MAX_LEN+10];12 int nLen;13 int i,j,k;14 while (~scanf("%s"
阅读全文
摘要:1 #include<stdio.h> 2 #include<string.h> 3 #include<stdlib.h> 4 int main() 5 { 6 char s1[110]; 7 char s2[15]; 8 int i,n; 9 while(1)10 {11 gets(s2);12 if(strcmp(s2,"ENDOFINPUT")==0)13 break;14 else if(strcmp(s2,"START")==0)15 {16 ...
阅读全文
摘要:已知二叉树的前序遍历序列和中序遍历序列,求后序遍历序列。先递归构造二叉树,再递归后序遍历。思路:前序序列的第一个结点为要构造的二叉树的根节点,在中序序列中查找此节点,则其左为要构造的二叉树的左子树的中序序列,其右为要构造的二叉树的右子树的中序序列。而前序序列根节点后面分别跟着它的左子树和右子树的前序序列。有了根节点在中序序列中的位置,就知道了左子树和右子树的前序序列分别占据了前序序列中的那些位置,这样,就分别知道了两棵子树所代表的子序列。然后在构造了根结点后,就可以递归调用函数自身来分别构造根节点的左子树和右子树。以上为二叉树的构造即恢复。后序遍历二叉树也用递归。 1 #include <
阅读全文
摘要:1 #include<stdio.h> 2 int main() 3 { 4 int sq[1000],a[1000];//sq为栈,a为B的出栈元素 5 int i,k,n,head; 6 while(scanf("%d",&n),n)//n为0则结束 7 { 8 while(scanf("%d",&a[0]),a[0])//a[0]=0的话表示本次数据结束 9 { 10 head=0;11 for(i=1;i<n;i++)12 scanf("%d"...
阅读全文
摘要:1 #include<stdio.h> 2 int rm[]={31,29,31,30,31,30,31,31,30,31,30,31}; 3 int pm[]={31,28,31,30,31,30,31,31,30,31,30,31}; 4 int isp(int year) 5 { 6 if((year%4==0&&year%100!=0)||year%400==0) return 1; 7 8 return 0; 9 }10 int main()11 {12 13 int y,m,n,d,dd,day;14 while(...
阅读全文
摘要:1 #include <iostream> 2 #include <math.h> 3 #define N 100 4 using namespace std; 5 6 int field[N][N]; 7 8 int main() 9 {10 int m, n, k, t, i, j;11 scanf("%d", &t);12 while (t--)13 {14 scanf("%d%d%d", &m, &n, &k);15 for (i=1; i<=m; i++)16 for (j=1; j
阅读全文
摘要:1 #include<stdio.h> 2 int main() 3 { 4 int m[13]={0,31,28,31,30,31,30,31,31,30,31,30,31}; 5 int year,mon,day,hour,min,sec,myear,mmon,mday,mhour,mmin,msec; 6 int i,n; 7 scanf("%d",&n); 8 while(n--) 9 {10 scanf("%d%*c%d%*c%d%*c%d%*c%d%*c%d",&hour,&min,&sec,&am
阅读全文