p0j 2488 A Knight's Journey
来源:互联网 发布:java启动exe程序 编辑:程序博客网 时间:2024/06/02 06:12
题目链接
题目大意:判断一个m*n的棋盘,能否用马步踏满
能输出字典序最小的一个
行(1,2,3.........)
列(A,B,C.......)
解题思路:用dfs遍历棋盘用v[][]记录是否踏过
用数组[][2]记录踏的顺序,如可踏满,则遍历输出即可
注意事项:输出坐标时先列后行
要字典序最小,8个方向的递归是有顺序的
编号从1开始
#include <cstdio>#include<iostream>#include<cstring>using namespace std;int p,q;int n[26*26+3][2]; //记录顺序bool v[28][28]; //访问标记bool f=0; //踏满标记int z[8][2]={ {-1,-2},{1,-2},{-2,-1},{2,-1},{-2,1},{2,1},{-1,2},{1,2} } ; //8个坐标void dfs(int x,int y,int t){ v[x][y]=1; n[t][0]=x; n[t][1]=y; if(t==p*q) { f=1; return; } else { int nx,ny; for(int i=0;i<8;++i) { nx=x+z[i][0]; ny=y+z[i][1]; if(nx>=0&&nx<p&&ny>=0&&ny<q&&v[nx][ny]==0) { dfs(nx,ny,t+1); v[nx][ny]=0; if(f) return; } } }}int main(){ int qq; cin>>qq; for(int i=0;i<qq;++i) { cin>>p>>q; cout<<"Scenario #"<<i+1<<":\n"; memset(v,0,sizeof(v)); f=0; dfs(0,0,1); if(!f) cout<<"impossible"<<endl; else { for(int i=1;i<=q*p;++i) { printf("%c%d",n[i][1]+'A',n[i][0]+1); } cout<<endl; } if(i!=qq-1) cout<<endl; } return 0;}
0 0
- p0j 2488 A Knight's Journey
- A Knight's Journey
- A Knight's Journey
- A knight's journey
- A Knight's Journey
- A Knight's Journey
- A Knight's Journey
- A Knight's Journey
- A Knight's Journey
- A Knight's Journey
- A Knight's Journey
- A Knight's Journey
- A Knight's Journey
- A Knight's Journey
- A Knight's Journey
- A Knight's Journey
- A Knight's Journey
- A Knight's Journey
- Android手机为什么不同GPU游戏兼容性差别巨大
- win32编程入门-子窗口控件
- Squares-暴力枚举或者二分
- java 反射浅析
- SqlServer 与 MySQL 基本操作语句对比
- p0j 2488 A Knight's Journey
- Android JNI错误--原因和解决办法
- ASM ClassReader failed to parse class file - probably due to a new Java class file version that isn
- Phone状态监听机制
- poj 1837 Balance -DP
- cin、cin.get()、cin.getline()、getline()、gets()函数的用法
- 动态限制EdiText只能输入特定字符
- Android权限
- Spring -- 注解配置Bean