此次实验:
题目一利用递归算法生成N个元素的全排列;
题目二棋盘问题。
实验内容:
1、 题目:设计一个递归算法生成n个元素{r1,r2,…,rn}的全排列。
输入:输入n个不相同的字符,表示list中n个元素。
输出:所有排列。
输入样例:
ABC
输出样例:
ABC
ACB
BAC
BCA
CAB
CBA
2、题目:在一个2k×2k 个方格组成的棋盘中,恰有一个方格与其他方格不同,称该方格为一特殊方格,且称该棋盘为一特殊棋盘。在棋盘覆盖问题中,要用图示(见教材P63图3-8)的4种不同形态的L型骨牌覆盖给定的特殊棋盘上除特殊方格以外的所有方格,且任何2个L型骨牌不得重叠覆盖。
输入:
输入两行数据,第一行输入一个整数k(k>0,产生 2k×2k的棋盘)
第二行输入两个整数dr和dc(0<=dr<2k, dc(0<=tr<2k)
输出:
棋盘覆盖结果
输入样例:
2
2 3
输出样例
2 2 3 3
2 1 1 3
4 1 5 0
4 4 5 5
题目一代码:(似乎有点问题)
#include"stdafx.h"
#include<stdio.h>
#include <iostream>
#include <algorithm>
using namespace std;
template<class Type>
void Perm(Type list[], int k, int m ) { //产生[list[k:m]的所有排列
if(k==m)
{ //只剩下一个元素
for (int i=0;i<=m;i++)
cout<<list[i];
cout<<endl;
}
else //还有多个元素待排列,递归产生排列
for (int i=k; i<=m; i++)
{
swap(list[k],list[i]);
Perm(list,k+1,m);
swap(list[k],list[i]);
}
}
int main() {
cout<<"输入样例"<< endl;
cout<<endl;
char ch[3];
int i;
for(i=0;i<3;i++){
ch[i]=getchar();
}
cout<<endl;
cout<<"输出样例"<< endl;
cout<<endl;
Perm(ch,0,2);
return 0;
}
运行结果
题目二代码:
#include<stdio.h>
#include <iostream>
#include <algorithm>
using namespace std;
int tile=1; //L型骨牌的编号(递增)
int Board[100][100]; //棋盘
void ChessBoard(int tr,int tc,int dr,int dc,int size)
{
if(size==1) return;
int t=tile++,s=size/2;
if(dr<tr+s && dc<tc+s)///在左上角区域内
ChessBoard(tr,tc,dr,dc,s);
else///不在左上角区域内
{
Board[tr+s-1][tc+s-1]=t;///用t号(用一个数字表示)L型骨牌覆盖右下角
ChessBoard(tr,tc,tr+s-1,tc+s-1,s);///覆盖剩余方格
}
if(dr<tr+s && dc>=tc+s)///在右上角区域内
ChessBoard(tr,tc+s,dr,dc,s);
else///不在右上角的区域内
{
Board[tr+s-1][tc+s]=t;
ChessBoard(tr,tc+s,tr+s-1,tc+s,s);
}
if(dr>=tr+s && dc<tc+s)
ChessBoard(tr+s,tc,dr,dc,s);
else
{
Board[tr+s][tc+s-1]=t;
ChessBoard(tr+s,tc,tr+s,tc+s-1,s);
}
if(dr>=tr+s && dc>=tc+s)
ChessBoard(tr+s,tc+s,dr,dc,s);
else
{
Board[tr+s][tc+s]=t;
ChessBoard(tr+s,tc+s,tr+s,tc+s,s);
}
}
void main()
{
int size;
cout<<"输入棋盘的size(大小必须是2的n次幂): ";
cin>>size;
int index_x,index_y;
cout<<"输入特殊方格位置的坐标: ";
cin>>index_x>>index_y;
ChessBoard ( 0,0,index_x-1,index_y-1,size );
for ( int i=0; i<size; i++ )
{
for ( int j=0; j<size; j++ )
cout<<Board[i][j]<<'\t';
cout<<endl;
}
}
运行结果: