zoukankan      html  css  js  c++  java
  • NOI2.5 8465:马走日

    描述

    马在中国象棋以日字形规则移动。

    请编写一段程序,给定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<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    int a,s,k,m,n,w[8]={1,2,2,1,-1,-2,-2,-1},u[8]={-2,-1,1,2,2,1,-1,-2};
    bool v[12][12];
    bool check(int x,int y)
    {
    	if(x>=0&&x<m&&y>=0&&y<n&&!v[x][y])
    		return 1;
    	return 0;
    }
    void find(int x,int y,int t)
    {
    	int i;
    	if(t==0)
    	{
    		k++;
    		return;
    	}
    	for(i=0;i<8;i++)
    		if(check(x+w[i],y+u[i]))
    		{
    			v[x][y]=1;
    			find(x+w[i],y+u[i],t-1);
    			v[x][y]=0;
    		}
    	return;
    }
    int main()
    {
    	int x,y;
    	scanf("%d",&a);
    	for(;a>=1;a--)
    	{
    		scanf("%d%d%d%d",&m,&n,&x,&y);
    		k=0;
    		find(x,y,m*n-1);
    		printf("%d
    ",k);
    	}
    }
    这题无毒无害,呵呵


  • 相关阅读:
    STM32F107的DAC配置
    步进电机工作原理
    winform笔记本蓝牙与外部蓝牙设备通信
    C#里三种强制类型转换
    IE6/7BUG之OL有序列表没顺序
    IE6/7BUG之列表UL楼梯
    IE6/7BUG之A超链接无效
    IE6/7BUG之overflow:hidden无效
    linux shell 管道命令(pipe)使用及与shell重定向区别
    UGUI研究院之全面理解图集与使用
  • 原文地址:https://www.cnblogs.com/Darknesses/p/12002580.html
Copyright © 2011-2022 走看看