【ACM暑假培训】递归算法4:马踏棋盘
2012-07-20 22:40
176 查看
4、马踏棋盘
问题描述:
在5*5的棋盘上,行坐标为X,列坐标为Y的位置放置一个国际象棋中的马,请求出,该棋子不重复的访问完每一个格子的方法数。
输入:
一行:用空格隔开的两个整数,分别表示马所在的行坐标X,列坐标Y。
输出:
一个整数,访问每一个格子一次且仅一次的方法数。
样例输入:
1 3
样例输出:
56
说明:此程序中改变N值即可改变棋盘大小;
马走“日”字,故i+x[k],j+y[k]表示马接下来可移动到的位置;
问题描述:
在5*5的棋盘上,行坐标为X,列坐标为Y的位置放置一个国际象棋中的马,请求出,该棋子不重复的访问完每一个格子的方法数。
输入:
一行:用空格隔开的两个整数,分别表示马所在的行坐标X,列坐标Y。
输出:
一个整数,访问每一个格子一次且仅一次的方法数。
样例输入:
1 3
样例输出:
56
说明:此程序中改变N值即可改变棋盘大小;
马走“日”字,故i+x[k],j+y[k]表示马接下来可移动到的位置;
#include<stdio.h> #define N 5 int x[8]={2,1,-1,-2,2,1,-1,-2}; int y[8]={1,2,2,1,-1,-2,-2,-1}; int flag ={0}; int n=1,count; void DFS(int i,int j) { if(n==N*N) { count++; //for(int a=1;a<=N;a++){ // for(int b=1;b<=N;b++) // printf("%d",flag[a][b]); // printf("\n"); //} // printf("\n"); } else for(int k=0;k<8;k++) { if(i+x[k]>0&&i+x[k]<=N&&j+y[k]>0&&j+y[k]<=N&&flag[i+x[k]][j+y[k]]==0) { flag[i+x[k]][j+y[k]]=1;n++; DFS(i+x[k],j+y[k]); flag[i+x[k]][j+y[k]]=0;n--; } } } void main() { count=0; int X,Y; scanf("%d %d",&X,&Y); flag[X][Y]=1; DFS(X,Y); printf("%d\n",count); }
相关文章推荐
- 【ACM暑假培训】递归算法2:数字全排列+字符串全排列
- 【ACM暑假培训】递归算法3:跳棋的挑战(八皇后问题)
- 大一暑假为期五周的ACM实验室培训结束了(2013.8.24)
- ACM暑假培训总结
- 2011年暑假ACM培训总结及省赛感悟
- 暑假经历之ACM培训第六天经验总结
- 暑假经历之ACM培训第七天--做一个简单题目安慰一下
- 【ACM暑假培训】1、穷举算法
- 【ACM暑假培训】2、递归算法···放苹果···
- 【ACM暑假培训】3、模拟算法(99乘法表+方块转换+循环数)
- 11.12 acm培训题Problem F: 查找单词
- 迷宫问题bsf ACM第三次培训
- 杭电ACM 2037 今年暑假不AC
- hdojHPU-ACM大一暑期培训练习题1-1 1001字符串统计
- [ACM]今年暑假不AC(贪心)
- 【ECJTU_ACM 11级队员2012年暑假训练赛(8) - D - Distinct Primes】
- hdu 3442 Three Kingdoms(ACM 暑假比赛)
- 网络工作室暑假后第二次培训资料(SQLServer存储过程和ADO.NET访问存储过程)整理(一)
- ACM培训第三周总结
- 2015年ACM暑假集训总结 暨 省赛总结