POJ A Knight's Journey
时间:2022-05-08
本文章向大家介绍POJ A Knight's Journey,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
题意:给你一定的格子的棋盘,一匹马是否可以遍历完全整个棋盘
1 #include<stdio.h>
2 #include<string.h>
3 const int MAXN=30;
4
5 //国际象棋纵是数字,横是英文
6 struct Node//用于最后字典序输出
7 {
8 int x,y;
9 }node[MAXN];
10
11 int t1[]={-1,1,-2,2,-2,2,-1,1};
12 int t2[]={-2,-2,-1,-1,1,1,2,2};
13 int vis[MAXN][MAXN];
14
15 int q,p;
16 int flag;
17
18 void DFS(int row,int col,int step)
19 {
20 if(flag) return ;
21 if(step==p*q)
22 {
23 flag=1;
24 return ;//遍历结束
25 }
26 if(row<0 || row >=p || col<0 || col>=q) return;
27 if(vis[row][col]) return ;
28
29 node[step].x=row;
30 node[step].y=col;
31 vis[row][col]=1;
32 for (int i=0;i<8;i++)//八个方向
33 {
34 if(!vis[row+t1[i]][col+t2[i]])
35 DFS(row+t1[i],col+t2[i],step+1);
36 }
37 vis[row][col]=0;
38
39 }
40
41 int main()
42 {
43 int T;
44 int cas=1;
45 scanf("%d",&T);
46 while(T--)
47 {
48 memset(vis,0,sizeof(vis));
49 flag=0;
50 scanf("%d%d",&p,&q);
51 DFS(0,0,0);
52 printf("Scenario #%d:n",cas++);
53 if(!flag) printf("impossiblen");
54 else
55 {
56 for (int i=0;i<p*q;i++)
57 {
58 printf("%c%d",node[i].y+'A',node[i].x+1);
59 }
60 printf("n");
61 }
62 printf("n");
63 }
64 return 0;
65 }
今天又把这道题重新做了一遍,搜索现在依旧很弱,这么简单的一个搜索都要调试半天找错误,后来才发现原来是忘记提前跳出了,当flag=1的时候说明已经找到额
第二个问题就是字典序搜索啦,由于国际象棋是列为字母,横为数字,所以他的字典树是
int row[]= {-1,1,-2,2,-2,2,-1,1};
int col[]= {-2,-2,-1,-1,1,1,2,2};
#include<stdio.h>
#include<string.h>
const int MAXN=40;
int vis[MAXN][MAXN];
int row[]= {-1,1,-2,2,-2,2,-1,1};
int col[]= {-2,-2,-1,-1,1,1,2,2};
struct Node
{
int x,y;
} node[MAXN];
int flag;
int p,q;
void DFS(int i,int j,int cur)
{
if(flag) return ;
if(cur==p*q)//这里也是问题,老是无法确定边界
{
flag=1;
node[cur].x=i;
node[cur].y=j;
return ;
}
node[cur].x=i;
node[cur].y=j;
for(int k=0; k<8; k++)
{
int row_vis=row[k]+i;
int col_vis=col[k]+j;
if(row_vis>=1 && row_vis<=p && col_vis>=1 && col_vis<=q && vis[row_vis][col_vis]==0)
{
vis[row_vis][col_vis]=1;
DFS(row_vis,col_vis,cur+1);
vis[row_vis][col_vis]=0;
}
}
}
int main()
{
int i,j;
int T;
int cas=1;
scanf("%d",&T);
while(T--)
{
flag=0;
memset(vis,0,sizeof(vis));
scanf("%d%d",&p,&q);
for(i=1; i<=p; i++)
{
for(j=1; j<=q; j++)
{
if(flag) break;
vis[i][j]=1;
DFS(i,j,1);
vis[i][j]=0;
}
if(flag) break;
}
printf("Scenario #%d:n",cas++);
if(!flag) printf("impossible");
else
{
for(i=1; i<=q*p; i++)
{
printf("%c%d",node[i].y+'A'-1,node[i].x);
}
}
printf("nn");
}
return 0;
}
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法