| 编程中国 | 业界新闻 | 技术文章 | 视频教程 | 下载频道 | 程序源码 | 个人空间 | 编程论坛
全能ASP/PHP/ASP.NET主机,支持月付专业 MSSQL 数据库空间,支持月付专业 MySQL 数据库空间,支持月付买域名,送MP3、MP4
高端软件开发 = 年薪十万不是梦赛孚耐:软件保护加密专家身份认证令牌USB KEY买空间,免费送域名(厦门中资源)
共有 32029 人关注过本帖
标题:[全民编程]76道高难度C++练习题.含NOI竞赛题.欢迎挑战
收藏  订阅  推荐  打印 
zkkpkk
Rank: 3Rank: 3
等级:中级会员
威望:4
帖子:474
积分:4866
注册:2006-6-17
回复:(野比)[全民编程]76道高难度C++练习题.含NOI竞...


程序代码:

<br>/*<br>3. 打印一个 N*N 的方阵,N为每边 <br>字符的个数(3<N<20), 要求最 <br>外一层为"T", 第二层为"J", 从第三层 <br>起每层依次打印数字 1,2,3,... <br>*/<br>#include &lt;iostream.h&gt;<br>#define MAX 22</P> <P>int main()<br>{<br> int i=0,j=0,m=1,n=3;<br> char charr[MAX][MAX];<br> char ch1='T';<br> char ch2='J';<br> //char tmp[2];</P> <P> for(i=0;i&lt;MAX-1;i++)<br> for(j=0;j&lt;MAX-1;j++)<br> charr[i][j]='a';</P> <P> cout&lt;&lt;"输入N的值:";<br> cin&gt;&gt;n;<br> int a=0,b=n-1,c=n-1,d=0;<br> bool bo=false;</P> <P> while(m&lt;=(n-4)/2+1)<br> {<br> for(i=0;i&lt;n;i++)<br> { <br> if(a==0)<br> { <br> if(charr[a][i]=='a')<br> charr[a][i]=ch1;<br> continue;<br> }<br> if(a==1)<br> {<br> if(charr[a][i]=='a')<br> charr[a][i]=ch2;<br> continue;<br> }<br> if(charr[a][i]=='a')<br> charr[a][i]=(char)m+(char)48;<br> }<br> <br> for(i=0;i&lt;n;i++)<br> {<br> if(b==n-1)<br> {<br> if(charr[i][b]=='a')<br> charr[i][b]=ch1;<br> continue;<br> }<br> if(b==n-2)<br> {<br> if(charr[i][b]=='a')<br> charr[i][b]=ch2;<br> continue;<br> }<br> if(charr[i][b]=='a')<br> charr[i][b]=(char)m+(char)48; <br> }<br> <br> for(i=n-1;i&gt;=0;i--)<br> {<br> if(c==n-1)<br> {<br> if(charr[c][i]=='a')<br> charr[c][i]=ch1;<br> continue;<br> }<br> if(c==n-2)<br> {<br> if(charr[c][i]=='a')<br> charr[c][i]=ch2;<br> continue;<br> }<br> if(charr[c][i]=='a')<br> charr[c][i]=(char)m+(char)48; <br> }<br> <br> for(i=n-1;i&gt;=0;i--)<br> {<br> if(d==0)<br> {<br> if(charr[i][d]=='a')<br> charr[i][d]=ch1;<br> continue;<br> }<br> if(d==1)<br> {<br> if(charr[i][d]=='a')<br> charr[i][d]=ch2;<br> continue;<br> }<br> if(charr[i][d]=='a')<br> charr[i][d]=(char)m+(char)48; <br> bo=true;<br> }</P> <P> a++;d++;c--;b--;<br> if(bo==true)<br> m++;<br> }</P> <P> for(i=0;i&lt;n;i++)<br> {<br> for(j=0;j&lt;n;j++)<br> cout&lt;&lt;charr[i][j]&lt;&lt;' ';<br> cout&lt;&lt;endl;<br> }<br> return 0;<br>}<br>

[此贴子已经被作者于2007-6-27 21:38:23编辑过]


我的阿根廷队何时涅磐啊,唉......
2007-6-26 13:36
wfpb
Rank: 12Rank: 12Rank: 12
等级:贵宾
威望:29
帖子:2188
积分:22230
注册:2006-4-2

第12题:不知道是不是这个意思.
打印出来的0,1,2,3分别表示:
0——向左
1——向右
2——向下
3——向上
不知道如何更高效率

程序代码:

class Coordinate <BR>{<BR>//注意:坐标代表的数字与2维数组相反。<BR> int abscissa; //横坐标<BR> int ordinate; //纵坐标<BR> int nWidth,nHeight;<BR> int dir;<BR>public:<BR> Coordinate(int a=-1,int b=-1,int w=0,int h=0)<BR> {<BR> dir=-1;<BR> abscissa=a;<BR> ordinate=b;<BR> nWidth=w;<BR> nHeight=h;<BR> } <BR> bool ToLeft()<BR> {<BR> if(abscissa==0)<BR> return false;<BR> abscissa--;<BR> dir=0;<BR> return true;<BR> }<BR> bool ToRight()<BR> {<BR> if(abscissa==nWidth)<BR> return false;<BR> abscissa++;<BR> dir=1;<BR> return true;<BR> }<BR> bool ToDown()<BR> {<BR> if(ordinate==nHeight)<BR> return false;<BR> ordinate++;<BR> dir=2;<BR> return true; <BR> }<BR> bool ToUp()<BR> {<BR> if(ordinate==0)<BR> return false;<BR> ordinate--;<BR> dir=3;<BR> return true;<BR> }<BR> bool DirOperate(int i)<BR> {<BR> if(abs(dir-i)==1 &amp;&amp; (dir+i)*2!=6)<BR> return false;<BR> switch(i)<BR> {<BR> case 0:return ToLeft();<BR> case 1:return ToRight();<BR> case 2:return ToDown();<BR> case 3:return ToUp();<BR> default:return false;<BR> }<BR> }<BR> bool operator==(Coordinate cd)<BR> {<BR> return abscissa==cd.abscissa&amp;&amp;ordinate==cd.ordinate;<BR> }<BR> void SetRange(int w,int h)<BR> {<BR> nWidth=w;<BR> nHeight=h;<BR> }<BR> int GetAbscissa()<BR> {<BR> return abscissa;<BR> }<BR> int GetOrdinate()<BR> {<BR> return ordinate;<BR> }<BR>};<BR>#include &lt;deque&gt;<BR>class Maze<BR>{<BR> Coordinate inner; //入口<BR> Coordinate outer; //出口<BR> int ** ppMap;<BR> int nWidth,nHeight;<BR>private:<BR> bool MazeLine(Coordinate in,deque&lt;int&gt;&amp;s)<BR> {<BR> Coordinate temp=in;<BR> for(int i=0;i&lt;4;i++)<BR> {<BR> in=temp;<BR> if(in.DirOperate(i))<BR> {<BR> if(ppMap[in.GetOrdinate()][in.GetAbscissa()]==1)<BR> {<BR> if(in==outer||MazeLine(in,s))<BR> {<BR> s.push_front(i);<BR> return true;<BR> }<BR> }<BR> }<BR> }<BR> return false;<BR> }<BR>public:<BR> Maze(Coordinate in,Coordinate out,int **map,int width,int height)<BR> {<BR> in.SetRange(width,height);<BR> ppMap=new int*[height];<BR> for(int i=0;i&lt;height;i++)<BR> ppMap[i]=new int[width];<BR> for (int m=0;m&lt;height;m++)<BR> for (int n=0;n&lt;width;n++)<BR> ppMap[m][n]=map[m][n];<BR> inner=in;<BR> outer=out;<BR> }<BR> bool MazeLine(deque&lt;int&gt;&amp;dq)<BR> {<BR> return MazeLine(inner,dq);<BR> }<BR>};</P> <P>int arr[][10]=<BR>{<BR> {0,1,0,0,0,0,0,0,0,0},<BR> {0,1,0,1,1,1,1,0,1,0},<BR> {0,1,1,1,0,0,1,0,1,0},<BR> {0,1,0,0,0,0,1,1,1,0},<BR> {0,1,0,0,0,0,0,0,0,0},<BR> {0,1,1,1,1,1,1,1,1,0},<BR> {0,1,0,0,0,1,0,1,0,0},<BR> {0,1,0,0,0,1,0,1,0,0},<BR> {0,1,0,1,1,1,0,1,1,0},<BR> {0,1,0,0,0,0,0,0,1,0}<BR>};</P> <P><BR>void main()<BR>{<BR> int **maze=new int*[10];<BR> for(int m=0;m&lt;10;m++)<BR> maze[m]=new int[10];</P> <P> for(int i=0;i&lt;10;i++)<BR> for(int j=0;j&lt;10;j++)<BR> maze[i][j]=arr[i][j];<BR> Maze mz(Coordinate(1,0),Coordinate(8,9),maze,10,10);<BR> deque&lt;int&gt;dq;<BR> if(mz.MazeLine(dq))<BR> cout&lt;&lt;"\nsuccess"&lt;&lt;endl;<BR> else<BR> cout&lt;&lt;"\nfail"&lt;&lt;endl;<BR> copy(dq.begin(),dq.end(),ostream_iterator&lt;int&gt;(cout));<BR>}


[glow=255,red,2]wfpb的部落格[/glow] 学习成为生活的重要组成部分!
2007-6-26 16:06
smartwind
Rank: 3Rank: 3
等级:中级会员
威望:1
帖子:277
积分:2874
注册:2006-11-13

75题:

程序代码:

<BR>#include &lt;iostream&gt;<BR>using namespace std;</P> <P>#define N 3</P> <P>const int a[N]={31,15,7};<BR> //{20,19,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1};<BR> //{200,179,157,140,139,110,103,101,97,90,80,64,51,45,36,25,14,10,9,6};<BR>int b[N];</P> <P>bool fun(int n,int i)<BR>{<BR> if(n==0)<BR> return true;<BR> if(i&gt;=N)<BR> return false;<BR> if(n&lt;a[i])<BR> return fun(n,i+1);<BR> if(fun(n-a[i],i))<BR> {<BR> b[i]++;<BR> return true;<BR> }<BR> else<BR> return fun(n,i+1);<BR>}</P> <P>int main()<BR>{<BR> int n,i,k;<BR> do<BR> {<BR> k=0;<BR> cin&gt;&gt;n;<BR> if(n&gt;10000||n&lt;0) //限制0&lt;n&lt;10000<BR> goto CON;<BR> if(fun(n,0)) //有解则输出结果<BR> {<BR> for(i=0;i&lt;N;i++)<BR> k+=b[i];<BR> cout&lt;&lt;k&lt;&lt;endl;<BR> for(i=0;i&lt;N;i++)<BR> {<BR> if(b[i]&gt;0)<BR> {<BR> cout&lt;&lt;a[i]&lt;&lt;"*"&lt;&lt;b[i]&lt;&lt;" ";<BR> b[i]=0;<BR> }<BR> }<BR> cout&lt;&lt;endl;<BR> }<BR> else<BR>CON: cout&lt;&lt;"no answer"&lt;&lt;endl;<BR> }<BR> while(n!=0); //输入0结束<BR> return 0;<BR>}<BR>


2007-6-27 10:47
weishj
Rank: 2
等级:注册会员
威望:2
帖子:141
积分:1562
注册:2007-4-22

第37题,不知题意理解的对不对
/*file name:37.cpp
37. 已知 N 个正整数满足 K1+K2+...+Kn=M。求一组最佳的分解,使得
K1*K2*....*Kn 为最大。
例如:N=2时,给定 K1+K2=6,当 K1=3,K2=3 时,K1*K2=9 为最大*/
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
int N=0,M=0,sum=0,diff=0,product=1;
int* arr=NULL;
float ave=0.0;
cout<<"输入数字个数N:"<<endl;
cin>>N;
cout<<"输入这些数字的和M:"<<endl;
cin>>M;
arr=new int[N];
ave=float(M)/float(N);
sum=int(ave)*N;
diff=M-sum;//diff肯定小于N
for(int i=0;i<N;i++)
{
if(i<diff) arr[i]=1+int(ave);
else arr[i]=int(ave);
}
cout<<"一个最佳分解是:"<<endl;
for(int j=0;j<N;j++)
{
cout<<setw(5)<<arr[j];
product*=arr[j];
}
cout<<endl<<"最大乘积是:"<<product<<endl;
delete []arr;
return 0;
}

If you shed tears when you miss the sun, you also miss the stars.
2007-6-27 11:16
zkkpkk
Rank: 3Rank: 3
等级:中级会员
威望:4
帖子:474
积分:4866
注册:2006-6-17

41题链表合并

程序代码:

<BR>/*<BR>41. (合并链表) 已知两个链<BR>表 AN={a1,a2,...an}, <BR>BN={b1,b2,...bm}, <BR>将其合并为一个链表 <BR>CN={a1,b1,a2,b2,...}<BR>*/</P> <P>#include &lt;iostream.h&gt;</P> <P>/*节点结构体Node*/<BR>struct Node<BR>{<BR> int data;<BR> Node* next;<BR>};<BR>/*结构体头指针*/<BR>Node* head1 = new Node;<BR>Node* head2 = new Node;<BR>Node* head3 = new Node;</P> <P>/*添加一个新节点*/<BR>void Push(Node* head,int data) <BR>{<BR> Node* node = new Node;<BR> node-&gt;data = data;<BR> node-&gt;next = head-&gt;next;<BR> head-&gt;next = node;<BR>}<BR>/*输出链表*/<BR>void Display(Node* head)<BR>{<BR> Node* temp=head-&gt;next;<BR> while(temp!=NULL)<BR> {<BR> cout&lt;&lt;temp-&gt;data&lt;&lt;'\t';<BR> temp=temp-&gt;next; <BR> }<BR> cout&lt;&lt;endl;<BR>}<BR>/*初始化一条链表*/<BR>Node* Info(Node* head,int a)<BR>{<BR> for(int i=0;i&lt;a;i++)<BR> Push(head,i);<BR> return head;<BR>}<BR>Node* Info_Input(Node* head,int a)<BR>{<BR> cout&lt;&lt;"请输入数据:"&lt;&lt;endl;<BR> for(int i=0;i&lt;a;i++)<BR> {<BR> int value;<BR> cout&lt;&lt;"第"&lt;&lt;i+1&lt;&lt;"个元素"&lt;&lt;endl;<BR> cin&gt;&gt;value;<BR> Push(head,value);<BR> }<BR> return head;<BR>}<BR>/*链表归并算法*/<BR>Node* UniteLink(Node* head1,Node* head2,Node* head3)<BR>{<BR> Node *p1=NULL,*p2=NULL; <BR> Node* temp1=head1-&gt;next;<BR> Node* temp2=head2-&gt;next;<BR> Node* temp3=head3;<BR> temp3-&gt;next=temp1;<BR> while((temp1!=NULL) &amp;&amp; (temp2!=NULL))<BR> {<BR> p1=temp1;<BR> temp1=temp1-&gt;next;<BR> p1-&gt;next=temp2;<BR> p2=temp2;<BR> temp2=temp2-&gt;next;<BR> p2-&gt;next=temp1;<BR> if((temp1==NULL) &amp;&amp; (temp2!=NULL))<BR> {<BR> p2-&gt;next=temp2;<BR> break;<BR> }<BR> else if((temp1!=NULL) &amp;&amp; (temp2==NULL))<BR> {<BR> p2-&gt;next=temp1;<BR> break;<BR> }<BR> }<BR> return temp3;<BR>}</P> <P>int main()<BR>{ <BR> head1-&gt;next=NULL;<BR> head2-&gt;next=NULL;<BR> head3-&gt;next=NULL;<BR> int a;<BR> cout&lt;&lt;"请输入链表A的数据长度:";<BR> cin&gt;&gt;a;<BR> Info_Input(head1,a);<BR> cout&lt;&lt;"构造链表A:"&lt;&lt;'\t';<BR> Display(head1);<BR> cout&lt;&lt;"请输入链表B的数据长度:";<BR> cin&gt;&gt;a;<BR> Info_Input(head2,a);<BR> cout&lt;&lt;"构造链表B:"&lt;&lt;'\t';<BR> Display(head2);<BR> UniteLink(head1,head2,head3);<BR> cout&lt;&lt;"合并后的链表CN:"&lt;&lt;'\t';<BR> Display(head3);<BR> return 0;<BR>}<BR>


我的阿根廷队何时涅磐啊,唉......
2007-6-27 16:24
HJin
Rank: 12Rank: 12Rank: 12
等级:贵宾
威望:27
帖子:401
积分:4134
注册:2007-6-9

To 野比:

If you have time, you may want to do some work to

1) give people credits
2) let people know which problem is solved.

Thanks,

HJin

I am working on a system which has no Chinese input. Please don\'t blame me for typing English.
2007-6-27 17:50
kai
Rank: 12Rank: 12Rank: 12
等级:版主
威望:37
帖子:3103
积分:32176
注册:2004-4-25

wfpb,

你在107楼关于第四题的代码是不正确的,看来你没有完全理解题意。
题目的本意是要你给出所有的解,而不是其中的某一种。

这道题是很难的,并不是什么太简单了,大家都不做了。


自由,民主,平等,博爱,进步.
2007-6-27 20:03
zkkpkk
Rank: 3Rank: 3
等级:中级会员
威望:4
帖子:474
积分:4866
注册:2006-6-17


程序代码:

<br>/*回旋填数*/<br>#include &lt;stdio.h&gt; <br>#include &lt;iostream.h&gt; </P> <P>int array[11][11]; <br>int temp; <br>int ROW;</P> <P>void godown(int &amp;m,int &amp;a) <br>{ <br> for(temp=1;temp&lt;=ROW;temp++) <br> if(array[temp][a]==0) <br> array[temp][a]=m++; <br> a++; <br>} <br>void goright(int &amp;m,int &amp;b) <br>{ <br> for(temp=1;temp&lt;=ROW;temp++) <br> if(array[b ][temp]==0) <br> array[b ][temp]=m++; <br> b--; <br>} <br>void goup(int &amp;m,int &amp;c) <br>{ <br> for(temp=ROW;temp&gt;0;temp--) <br> if(array[temp][c]==0) <br> array[temp][c]=m++; <br> c--; <br>} <br>void goleft(int &amp;m,int &amp;d) <br>{ <br> for(temp=ROW;temp&gt;0;temp--) <br> if(array[d][temp]==0) <br> array[d][temp]=m++; <br> d++; <br>}</P> <P>int main() <br>{ <br> int a,b,c,d,max,m; <br> cout&lt;&lt;"请输入缧旋方阵的维数n(不能大于10):"; <br> cin&gt;&gt;ROW; <br> cout&lt;&lt;endl;<br> for(a=1;a&lt;=ROW;a++) <br> for(b=1;b&lt;=ROW;b++) <br> array[a][b ]=0;<br> m=1;<br> a=d=1; <br> b=c=ROW; <br> max=ROW*ROW;</P> <P> while(m&lt;=max) <br> { <br> godown(m,a); <br> goright(m,b);<br> goup(m,c); <br> goleft(m,d); <br> } <br> for(a=1;a&lt;=ROW;a++) <br> { <br> for(b=1;b&lt;=ROW;b++) <br> printf("%3d ",array[a][b ]); <br> cout&lt;&lt;endl; <br> }<br> return 0;<br>} <br>



程序代码:
<br>/*倒填*/<br>#include &lt;iostream.h&gt;<br>#define MAX 5</P> <P>int main()<br>{<br> int i=0, j=0;<br> int array[MAX][MAX];<br> int t=MAX*MAX;</P> <P> for(i=0;i&lt;MAX;i++)<br> for(j=0;j&lt;MAX;j++)<br> array[i][j]=t--;</P> <P> for(i=0;i&lt;MAX;i++)<br> {<br> for(j=0;j&lt;MAX;j++)<br> cout&lt;&lt;array[i][j]&lt;&lt;'\t';<br> cout&lt;&lt;endl;<br> }</P> <P> return 0;<br>}<br>

[此贴子已经被作者于2007-6-29 11:43:55编辑过]


我的阿根廷队何时涅磐啊,唉......
2007-6-27 21:39
野比
Rank: 12Rank: 12Rank: 12
等级:贵宾
威望:14
帖子:990
积分:10576
注册:2007-5-24

To HJin,

I'm very sorry to tell you that I do not have much time recently...
My boss got me plenty of works to do...

You can edit my posts by yourself, since you are now the moderator of the cpp classroom...
I don't have as much time as you do...

Thanks,
Nobi

2007-6-27 22:08
aipb2007
Rank: 12Rank: 12Rank: 12
来自:CQU
等级:贵宾
威望:40
帖子:2881
积分:29414
注册:2007-3-18

你也是斑竹,他也是斑竹,所以不得行。

还是你自己能来,等有空了再搞吧,呵呵~工作要紧!

Fight  to win  or  die...
2007-6-27 22:47
关于我们 | 广告合作 | 编程中国 | 清除Cookies | Archiver | WAP | TOP

编程中国 版权所有,并保留所有权利。鲁ICP备08000592号
Powered by Discuz, Processed in 0.090923 second(s), 9 queries.
Copyright©2004-2008, BCCN.NET, All Rights Reserved