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