c++编程题目

3:马走日(horse.cpp)
【问题描述】
马在中国象棋以日字形规则移动。请编写一段程序,给定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>
using namespace std ;
int n,m, ans = 0 ;
int dx[8] = {-1,-2,-2,-1,1,2,2,1}, dy[8] = {-2,-1,1,2,-2,-1,1,2} ;
bool visit[20][20] ;
bool isvalid (int x,int y) {
    return x < n && x >= 0 && y < m && y >= 0 && !visit[x][y] ;
}
void dfs(int step, int x,int y) {
    if (step == n * m) {
        ans ++; return ;
    }
    for (int d = 0; d < 8; d ++) {
        int xx = x + dx[d], yy = y + dy[d] ;
        if (isvalid(xx,yy)) {
            visit[xx][yy] = 1 ;
            dfs(step + 1,xx,yy) ;
            visit[xx][yy] = 0 ;
        }
    }
}
int main()
{
    int T ;
    cin >> T ;
    while (T --) {
        memset(visit,0,sizeof(visit)) ;
        int x,y ;
        cin >> n >> m >> x >> y ;
        ans = 0; visit[x][y] = 1 ;
        dfs(1,x,y) ;
        printf("%d\n",ans) ;
    }
    return 0 ;
}

简单的dfs一下,dx和dy是方向数组,表示马的8种走法,dfs时判断每种走法是否在棋盘内且未被访问过(isvalid函数,visit数组标记是否访问过),当走过的步数等于m*n即棋盘大小时答案+1。望采纳!

温馨提示:内容为网友见解,仅供参考
无其他回答

c++p3编程求100+97+……+4+1的值
您好,可以使用循环语句来解决这个问题。可以使用for循环语句来对1~100之间的所有奇数进行求和并输出结果,实现代码如下:include <iostream>using namespace std;int main() { int sum = 0; for (int i = 1; i <= 100; i+= 2) { sum += i;} cout << "sum = " << sum << ...

C++编程输入一个字符,将其大写或者小写.
代码在DEVC++环境下运行效果如下:

...一个元素移到数组末尾,其余数据依次往前平移一个位置.c++编程...
2035:【例5.2】平移数据 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 5721 通过数: 3810 【题目描述】将a数组中第一个元素移到数组末尾,其余数据依次往前平移一个位置。【输入】第一行为数组a的元素个数;第二行为n个小于1000的正整数。【输出】平移后的数组元素,每个数用一个空格隔...

求助,C++编程,输入20个数,求众数的问题,要编写comp函数,有点懵逼...
这个是C语言自带的快排算法,comp函数就是你要排序的方式 函数原型是 int comp(const void* a,const void *b);大体的意思就是 如果你要从大到小排序,那就return *(int* a) - *(int* b)如果你要从小到大排序,那就return *(int* b) - *(int* a)当然可以更加灵活,比如按照结构体中的...

c++新手问题编程输出100以内的素数,请注释...
using namespace std;int main(){ int j;for(int i=2;i<100;i++) \/\/第一循环是从2-100个数 { for(j=2;j<=i\/2;j++) \/\/第二个循环是判断i的值是不是素数.{ if(i%j==0) \/\/如果被整除 那么就不是素数.跳出 break;} if(j>i\/2) \/\/判断上面循环是否正常结束 cout<<...

C++编程 已知A>B>C,A+B+C<100,求满足1\/A*A+1\/B*B=1\/C*C的共有多少组...
( (A * A * B * B) == ((A * A + B * B) * C * C) )分式化整式好像没错,其实它是错的。int的最大值是65530 ,当你a=b=50的时候,A * A * B * B早早数据溢出了。将int 改为long就行了。还有你程序我调试了下,第三个for应该改为 for(A=B+1;A<100;A++)这样...

请问大家这道C++编程题怎么做?求帮忙
先将输入的数保存到数组,然后遍历数字,判断相邻数字是否相同即可 使用一个变量记录当前是否处于数字连续的状态,用于输出中括号 一个小技巧是给数组多分配一个位置并将其置为-1,方便判断数组最后一个数 C++代码和运行结果如下:输出符合样例,望采纳~附源码链接:判断连续数字 ...

c++编程求输入一个正整数(任意位数),倒序输出!
【解题思路】整数的逆序输出是很常见的题目,也比较简单。可以通过取余运算符(%)和除号(\/)来完成,具体的思路如下:比如要对123逆序输出。第一步是先对 123除以10取余数,这样就会得到3;第二步是把123除以10取整,得到12,然后再把3*10+12%10,得到32;第三步是把12除以10取整,得到1,然后再...

求阶乘之和。用c++语言编程。
include<iostream> using namespace std;int main(){ int i = 0,fac = 1, sum = 0, k;cout << "Please input the value of k : ";cin >> k;while(sum <= k){ ++i;fac = fac * i;\/\/求阶乘 sum = sum + fac;\/\/求阶乘之和 } cout << "1" << '!';for(int j = ...

C++编写程序。输入两个正整数,求它们的最大公约数和最小公倍数。_百 ...
include<iostream.h> include<math.h> void main(){int a,num1,num2,temp;cout<<"please input two numbers:");cin>>num1>>num2;int ji = num1*num2;if(num1<num2) \/*保证第一数是较大的值*\/ {temp=num1;num1=num2;num2=temp;} ...

相似回答