1.  马走日

【问题描述】

马在中国象棋以日子形规则移动。请编写一段程序给定n*m大小的棋盘,以及马的初始位置(x,y),要求不能重复经过棋盘上的同一个点,计算马可以有多少途径遍历棋盘上的所有点。

输入:第一行为整数T(T<10),表示测试数据组数。每一组测试数据包含一行,为四个整数,分别为棋盘的大小以及初始位置坐标n,m,x,y。(0≤x≤n-1,0≤y≤m-1,m<10,n<10)

输出:每组测试数据包含一行,为一个整数,表示马能遍历棋盘的途径总数,0为无法遍历一次。

【样例输入】

1

5 4 0 0

【样例输出】

32

#include<iostream>
#define N 11
using namespace std;
int n,m,bx,by,ans = 0;
int vist[N][N];
void clearZ(){
    for(int i = 0; i < n; i++){
        for(int j = 0; j < m; j++){
            vist[i][j] = 0;
        }
    }
}
bool check(){
    for(int i = 0; i < n; i++){
        for(int j = 0; j < m; j++){
            if(!vist[i][j]) return false;
        }
    }
    return true;
}
void dfs(int x, int y){
    if(x >= 0 && x < n && y >= 0 && y < m && !vist[x][y]){
        vist[x][y] = 1;
        if(check()){
            ans++;
        }
        else{
            dfs(x-1,y-2);
            dfs(x-2,y-1);
            dfs(x-2,y+1);
            dfs(x-1,y+2);
            dfs(x+1,y-2);
            dfs(x+2,y-1);
            dfs(x+2,y+1);
            dfs(x+1,y+2);
        }
        vist[x][y] = 0;
        
    }
}
int main()
{
    int T;
    cin >> T;
    while(T--){
        cin >> n >> m >> bx >> by;
        clearZ();
        dfs(bx,by);
        cout << ans << endl;
    } 
    return 0;
}

2.  2n皇后问题

【问题描述】

给定一个 n*n 的棋盘,棋盘中有一些位置不能放皇后。现在要向棋盘中放入 n 个黑皇后和 n个白皇后,使任意的两个黑皇后都不在同一行、同一列或同一条对角线上,任意的两个白皇后都不在同一行、同一列或同一条对角线上。问总共有多少种放法?(n<=8)

【输入格式】

输入的第一行为一个整数 nn,表示棋盘的大小。

接下来n行,每行n个0或1的整数,如果一个整数为1,表示对应的位置可以放皇后,如果一个整数为0,表示对应的位置不可以放皇后。

【输出格式】

输出n个数,为满足要求的序列。

【样例输入】  

4

1 1 1 1

1 1 1 1

1 1 1 1

1 1 1 1

【样例输出】

2

【样例输入】  

4

1 0 1 1

1 1 1 1

1 1 1 1

1 1 1 1

【样例输出】

0

 

3.  求最大路径

【问题描述】

把数1到N排放成一周,每2个相邻的数的差的平方为2个数之间的距离。问怎样排放可以使一圈的距离最大,输出这个最大值。 例如:1 6 2 4 3 5最大距离就是25+16+4+1+4+16=66;

输入:第1行输入一个正整数N<12。

输出:一个整数,最大周长的值。

【样例输入】

6

【样例输出】

66