C++ 解决圆桌骑士问题
发布网友
发布时间:2022-04-22 05:28
我来回答
共4个回答
热心网友
时间:2024-02-03 19:44
knight of the Round Table
(亚瑟王的)圆桌骑士
相关资料:
●亚瑟王与圆桌骑士(King Arthur and knight of round table)●
“Whoso pulleth out this sword from this stone and anvil is ly born King of all England(凡能从石台上拔出此剑者,即为英格兰的天命之王)”
King Arthur and knight of round table(亚瑟王与圆桌骑士)来源于亚瑟王的传说,是亚瑟王身边的骑士的统称,因他们聚会的桌子是个圆桌而得名,著名的圆桌骑士有12位。
模型为Fisher-Price公司出品的imaginext玩具中的The legend of King Arthur系列。
Sir Galahad(加拉哈德爵士):
最纯洁完美的骑士,是Lancelot(兰斯洛特)和Elaine(伊莱恩,阿斯特洛封主佩莱斯之女)的儿子。他在刚来到亚瑟的宫殿的时候,就坐在了一个危险的座位上,因为这个位置的骑士将担负寻找圣杯的任务。但作为一个几乎完美的骑士,最终他还是把圣杯找到了。
相关传奇:Saint Greal(圣杯)
圣杯相传系耶稣被钉於十字架之前日,曾同门徒们进最后的晚餐的时候使用的用绿柱玉琢制的酒杯,而在亚瑟王的传说里面,圣杯全部都是金制的。寻找圣杯在传说里是一个非常神圣的主题,因为在亚瑟王的世界里没有出现过非常强大的*势力,最多是救助被欺负的妇女或者帮别人报仇什麽的,一小群异教徒撒拉森人一打就散。因此寻得圣杯的行为就显得格外的神奇伟大。
圣杯最早出现,是在兰斯洛特旅行到佩莱斯王的领地共进晚餐的时候出现的,从叙述上来看是幻影,有美丽的少女手持金杯向伯莱斯王走来,大家马上跪倒祈祷。佩莱斯王后来说,圣杯如果有一天出现了,圆桌就注定要销毁。兰斯洛特在巫师的欺骗下和佩莱斯的公主伊莱恩结合并产下一子,取名加拉哈德,那个孩子在幼时就遇到过同样的圣杯显圣,并由持杯的少女宣布成年后会由他坐上圆桌的危险席位,并由他寻得圣杯。
真正领受圣杯的是加拉哈德。(过程就是坐在大厅里,圣杯突然出现……这算哪门子寻找啊?)他因为圣洁童贞被圣杯选中,并用圣杯帮助了别人,留下许多奇迹,他自己也被当地推举了王位,但他醉心於神圣的幸福,不断的祈求上帝带走他,於是他很快去世了。他去世的时候一只手从天上伸下来取回了圣杯。
Sir Lancelot(兰斯洛特爵士):
圆桌骑士里的第一勇士,温文尔雅,又相当勇敢,而且乐于助人。他曾出发去寻找过圣杯,但由于他的骄傲使他没有成功。在王后开始进行火焰的试练时,他为了将她从火中救出而发动了一次不必要的战斗,由于误杀了加文的弟弟加瑞斯,而导致了圆桌骑士的*。在这场战斗后,他为了忏悔他的罪过而当了僧侣,直到他死去也没有新的故事了。
相关传奇1:
兰斯洛特刚加入亚瑟圆桌骑士团的时候没有任何功绩,为了证明自己他踏上了旅程,他帮助了许多人,击败了*的骑士,杀死了使村庄生灵涂炭的火龙,至此他赢得了所有圆桌骑士们的尊敬。
★ Sir Lancelot & the Dragon(兰斯洛特和龙) ★
相关传奇2:
蓝斯洛的年纪其实比亚瑟王和格温娜维尔王后小很多,他是King Ban of Benwick之子。Ban死后, 他被弃於湖边, 他自小被一群湖中仙女养大,被称作“湖上骑士”。个性温柔体贴、尊敬妇女,也善於跟女性相处,可以说是女性最完美的情人形象。
王后和兰斯洛特的恋情几乎成了公开的秘密,所有的骑士都在谈论。而终於正式告发,亚瑟也颁布了逮捕令,在他们幽会的时候又有12名骑士前去暗杀,结果被尽数杀死,兰斯洛特乘机逃离。其后格温娜维尔王后被判火刑,兰斯洛特率领战友前往刑场解救,所向披靡,“凡是抗拒他们的,全*,所有批戴武装的优秀骑士,一经交锋,立即丧命”,救走了格温娜维尔王后,并依恃自己的领地抵御亚瑟的征讨。后在教皇的调解下与亚瑟和解,迫於荣誉交还格温娜维尔王后(因为按照记载在公开场合他一直否认他和王后的私情)。在后来亚瑟在平叛战死后,格温娜维尔王后知道一切皆由自己起,非常自责,在丈夫死后做了修女。兰斯洛特回英格兰找到她后,她虽然因为激动晕倒了三次,但仍然拒绝陪伴兰斯洛特。兰斯洛特绝望之下也出家作了修士,二人至死再未相见。
Sir LamorakdeGalis:
Lamorak(拉玛洛克)爵士是Pellinore(派里诺尔)国王的儿子,是三位最有力量的骑士之一,曾一次打败过30个骑士,他的*术在当时是被认为不可超越的。Lamorak爵士是Margawse王后的骑士。他最后被Mordred(莫德雷德,诅咒之子)杀死,在他正在对抗3个骑士的时候莫德雷德悄悄走到背后,杀死了他。
Sir Gawain(加文爵士):
奥克尼郡国王最年长的儿子,他是在亚瑟的婚礼上被授与的爵位。他曾拒绝让Guinevere(格温娜维尔,亚瑟王的王后/兰斯洛特的情人)进行“火焰的试练”,但最后试练还是被允许了。后来,加文的弟弟加雷思(下文会提到)在兰斯洛特救王后的时候被误杀了。加文非常悲痛,也曾因为这件事导致了圆桌骑士的*而向兰斯洛特寻仇。但在他临死之前,还是原谅了兰斯洛特,并为自己的恨意作了忏悔,最后他被葬在了多佛城堡。
相关传奇:瑞格蕾尔小姐
亚瑟王在外出时被巫师欺骗而将被砍头,由于亚瑟信守诺言所以巫师出了一个谜题,如果亚瑟找到答案将不会被砍头,这个迷题是“女人最想要的是什么”。亚瑟寻找了许久也没有找到答案,直到遇到一位无比丑陋的女巫瑞格蕾尔小姐,但这位女巫提出条件,要求一位圆桌骑士娶她为妻,这时加文爵士为了亚瑟而答应了女巫的条件。
最后亚瑟知道了答案“女人最想要的是自主权”,而加文也举行了婚礼。女巫在婚礼上出尽了洋相,而在晚上她却变成了美丽的少女,她问加文“我每天一半时间是巫婆,一半时间是少女,你想我在白天和晚上分别是什么样子呢?”加文说“你自己决定吧”,这时瑞格蕾尔小姐高兴的说“加文,你还没有忘了迷题!我想要白天晚上都是少女的模样”,于是从此加文爵士多了位善良漂亮的妻子。
★ Sir Gawain vs. the Green Knight(其实与绿武士对决的应该是加雷斯) ★
Sir Gaheris(加赫里斯爵士):
加赫里斯也是奥克尼郡国王的儿子,他是加文的弟弟,在成为骑士之前他是他哥哥的侍从。他和他哥哥一起在火焰的试练中将格温娜维尔王后救出,然后他们最小的弟弟加雷思就发生了意外事故,从此失去了爱弟的加文爵士和加赫里斯爵士在很长一段时间里相当的恨兰斯洛特。
Sir Gareth(加雷思):
奥克尼郡国王最年轻的儿子,亚瑟的侄子。在刚进入亚瑟的宫殿的时候隐藏了他的名字和身份,凯伊爵士把他安排在厨房里打杂。加雷思后来接受了Linnet(丽奈特)的任务,打败了黑武士,绿武士,蓝武士,棕武士,最后打败了红武士(Red Knight),将丽奈特的姐姐Lionesse(丽奥奈丝)救了出来并爱上了她。他们的爱受到了妹妹丽奈特的阻挠,不过最后亚瑟亲自出面,才有情人终成眷属。加雷思最后在拯救王后事件(火焰的试练)中被兰斯洛特杀死。
★ Red Knight Brigade(红武士及随从) ★
Sir Kay(凯伊爵士):
Ector(艾克特,亚瑟的养父)爵士的儿子,和亚瑟是兄弟。当和艾克特第一次参加比武竞技的时候,将剑忘在了旅店没有带出来,亚瑟跑回去拿的时候旅店已经关门了,没办法就随手把一把插在石头上的剑拔了出来。从此亚瑟就成了英国的国王。在亚瑟当上国王后,他让凯伊作了宫廷的管家。凯伊爵士有点管不住自己的嘴巴,但绝对是个可信的骑士。
另外,团IDC网上有许多产品团购,便宜有口碑
热心网友
时间:2024-02-03 19:44
递归算法。
#include <iostream>
using std::cout;
using std::endl;
using std::cin;
int count = 0;
int pair_num;
int oppo[66][2];
void round(int* list,int begin,int end);
inline void swap(int &lvalue,int &rvalue);
bool check(int *list,int lvalue,int rvalue,int end);
int main()
{
int list[12] = {1,2,3,4,5,6,7,8,9,10,11,12};
int number;
int times;
cin >> times;
while(times--)
{
count = 0;
cin >> number >> pair_num;
if (pair_num!=0)
{
for (int i =0 ; i< pair_num; i++)
{
cin >> oppo[i][0];
cin >> oppo[i][1];
}
}
round(list,1,number - 1);
cout << count << endl;
}
}
void round(int* list,int begin,int end)
{
if(begin == end)
{
//for(int i = 0; i <= end; ++i)
// {
// cout << list[i] << " ";
// }
// cout << endl;
bool succ = true;
for(int i =0; i< pair_num; ++i)
{
if (check(list,oppo[i][0],oppo[i][1],end))
{
succ = false;
break;
}
}
if (succ)
{
count++;
}
}
else
{
for (int i = begin; i <= end; ++i)
{
swap(list[begin],list[i]);
round(list,begin + 1,end);
swap(list[begin],list[i]);
}
}
}
inline void swap(int &lvalue,int &rvalue)
{
if(lvalue == rvalue)
return;
int temp = lvalue;
lvalue = rvalue;
rvalue = temp;
}
// true: disallowed seat arrangement
// false: allowed seat arrangement
bool check(int *list,int lvalue,int rvalue,int end)
{
for (int i = 0; i<= end; ++i)
{
if ( list[i] == lvalue && list[(i+1)%(end+1)] == rvalue || list[i] == rvalue && list[(i+1)%(end+1)] == lvalue)
{
return true;
}
}
return false;
}追问能介绍下思路吗
追答void round(int* list,int begin,int end); //递归,生成所有的排列
inline void swap(int &lvalue,int &rvalue); //辅助函数,在round中调用,用于交换两个值
bool check(int *list,int lvalue,int rvalue,int end); // 在每次生成的排列中,检查是否存在有不能坐在一起的骑士
//下面介绍下round生成排列的方法
递归思想:对于数组{1,2,...,n}要生成全排列,依次把数组中的第i个数与第一个数调换位置,剩下的n-1个数再进行全排列,即可得到全部的排列方法。
热心网友
时间:2024-02-03 19:45
#include<stdio.h>
#include<math.h>
void main()
{
unsigned long a,j,o;
unsigned int n[100],k[100],i,q,p,b[100],m[100]={0},t=1;
b[0]=0;
scanf("%d",&t);
for(i=0;i<t;i++)
{
scanf("%d %d",&n[i],&k[i]);
a=pow(n[i],n[i]-1);
for(j=0;j<a;j++)
{
o=j;
for(p=1;p<n[i];p++)
{
b[p]=o%n[i];
o=(o-b[p])/n[i];
}
p=0;
while(p<n[i]-1)
{
q=p+1;
while(q<n[i])
{
if(b[p]==b[q])break;
q=q+1;
}
if(q!=n[i])break;
p=p+1;
}
if(p!=n[i]-1)continue;
for(p=0;p<n[i];p++)
{
if(k[i]!=0&&b[p]<2*k[i]&&b[p]%2==0)
{
if(b[0]==b[n[i]-1]-1)break;
if(b[p]==b[p-1]-1||b[p]==b[p+1]-1)break;
}
}
if(p==n[i])m[i]=m[i]+1;
}
}
for(i=0;i<t;i++)printf("%d\n",m[i]);
}追问能介绍一下思路吗?
热心网友
时间:2024-02-03 19:45
北航软院的吧!数据结构第四题