SDUT 1400 马的走法 简单dfs

马的走法

Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^

题目描述

在一个4*5的棋盘上,马的初始位置坐标(纵 横)位置由键盘输入,求马能返回初始位置的所有不同走法的总数(马走过的位置不能重复,马走“日”字)。如果马的初始位置坐标超过棋盘的边界,则输出ERROR。例如初始位置为4 6,则输出ERROR。

输入

输入数据只有一行,有两个用空格分开的整数,表示马所在的初始位置坐标。首行首列位置编号为(1 1)。

输出

输出一行,只有一个整数,表示马能返回初始位置的所有不同走法的总数。

如果输入的马的初始位置超出棋盘边界,则输出ERROR。

示例输入

2 2

示例输出

4596
  • 提交 
  • 状态 
  • 讨论
    • ACcode:
    • #include <map>
      #include <queue>
      #include <cmath>
      #include <cstdio>
      #include <cstring>
      #include <stdlib.h>
      #include <iostream>
      #include <algorithm>
      #define rd(x) scanf("%d",&x)
      #define rd2(x,y) scanf("%d%d",&x,&y)
      #define ll long long int
      #define maxn 100005
      #define mod 1000000007
      #define INF 0x3f3f3f3f //int×î´óÖµ
      #define FOR(i,f_start,f_end) for(int i=f_start;i<=f_end;++i)
      #define MT(x,i) memset(x,i,sizeof(x))
      #define PI  acos(-1.0)
      #define E  exp(1)
      using namespace std;
      int tu[8][2]={{1,2},{1,-2},{-1,2},{-1,-2},{2,1},{2,-1},{-2,1},{-2,-1}};
      int amap[5][6];
      int dx,dy,cnt;
      void dfs(int x,int y){
          int posx,posy;
          for(int i=0;i<8;++i){
              posx=x+tu[i][0];
              posy=y+tu[i][1];
              if(posx>0&&posx<=4&&posy>0&&posy<=5&&amap[posx][posy]==0){
                  amap[posx][posy]=1;
                  dfs(posx,posy);
                  amap[posx][posy]=0;
              }
              else if(posx==dx&&posy==dy)
                  cnt++;
          }
      }
      int main(){
          while(rd2(dx,dy)!=EOF){
              if(dx<=0||dx>4||dy<=0||dy>5){
                  printf("ERROR\n");
                  continue;
              }
              MT(amap,0);
              amap[dx][dy]=1;
              cnt=0;
              dfs(dx,dy);
              printf("%d\n",cnt);
          }
          return 0;
      }
      


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值