POJ 2488 深搜dfs、

题意:模拟国际象棋中马的走棋方式,其实和中国象棋的马走的方式其实是一样的,马可以从给定的方格棋盘中任意点开始,问是否能遍历全部格子,能的话输出字典序最小的走棋方式,否则输出impossible

思路:只要能遍历全部的格子,就一定会走A1这个点,而且这个点的字典序是最小的,保证了这点的话还需要保证dfs的8个方向也要按照字典序最小来走,这样就可以确保所走的路径就是字典序最小的

坑爹:自己忘记输出Scenario #i,一连WA了几发,就是不知道自己错在哪里,顺便发一个对照的程序吧我的程序过16MS,他的程序0MS

先贴自己的

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<cmath>
 4 const int qq=100;
 5 int vis[qq][qq];
 6 int dx[]={-2,-2,-1,-1,1,1,2,2},
 7     dy[]={-1,1,-2,2,-2,2,-1,1};
 8 int map[qq][qq];
 9 int n,m,flag,ans;
10 int check(int y,int x)
11 {
12     if(x<1||y<1||x>m||y>n||map[y][x])
13         return 1;
14     return 0;
15 }
16 void dfs(int y,int x,int step)
17 {
18     if(flag)    return;
19     if(check(y,x))    return;
20     vis[step][0]=x;
21     vis[step][1]=y;
22     if(step==n*m){
23         flag=1;
24         ans=step;
25         return;
26     }
27     for(int i=0;i<8;++i){
28         map[y][x]=1;
29         dfs(y+dy[i],x+dx[i],step+1);
30         map[y][x]=0;
31     }
32     return;
33 }
34 int main()
35 {
36     int t,o=1;scanf("%d",&t);
37     while(t--)
38     {
39         flag=0;
40         scanf("%d%d",&n,&m);
41         memset(vis,0,sizeof(vis));
42         memset(map,0,sizeof(map));
43         ans=0;
44         dfs(1,1,1);
45         printf("Scenario #%d:\n",o++);
46         if(ans!=n*m){
47             printf("impossible");
48         }
49         else{
50             for(int i=1;i<=ans;++i){
51             printf("%c",vis[i][0]+‘A‘-1);
52             printf("%d",vis[i][1]);
53             }
54         }
55         printf("\n");
56         if(t!=0)    printf("\n");
57     }
58     return 0;
59 }
 1 #include<cstdio>
 2 02.#include<cstring>
 3 03.#include<algorithm>
 4 04.using namespace std;
 5 05.
 6 06.int path[88][88], vis[88][88], p, q, cnt;
 7 07.bool flag;
 8 08.
 9 09.int dx[8] = {-1, 1, -2, 2, -2, 2, -1, 1};
10 10.int dy[8] = {-2, -2, -1, -1, 1, 1, 2, 2};
11 11.
12 12.bool judge(int x, int y)
13 13.{
14 14.    if(x >= 1 && x <= p && y >= 1 && y <= q && !vis[x][y] && !flag)
15 15.        return true;
16 16.    return false;
17 17.}
18 18.
19 19.void DFS(int r, int c, int step)
20 20.{
21 21.    path[step][0] = r;
22 22.    path[step][1] = c;
23 23.    if(step == p * q)
24 24.    {
25 25.        flag = true;
26 26.        return ;
27 27.    }
28 28.    for(int i = 0; i < 8; i++)
29 29.    {
30 30.        int nx = r + dx[i];
31 31.        int ny = c + dy[i];
32 32.        if(judge(nx,ny))
33 33.        {
34 34.
35 35.            vis[nx][ny] = 1;
36 36.            DFS(nx,ny,step+1);
37 37.            vis[nx][ny] = 0;
38 38.        }
39 39.    }
40 40.}
41 41.
42 42.int main()
43 43.{
44 44.    int i, j, n, cas = 0;
45 45.    scanf("%d",&n);
46 46.    while(n--)
47 47.    {
48 48.        flag = 0;
49 49.        scanf("%d%d",&p,&q);
50 50.        memset(vis,0,sizeof(vis));
51 51.        vis[1][1] = 1;
52 52.        DFS(1,1,1);
53 53.        printf("Scenario #%d:\n",++cas);
54 54.        if(flag)
55 55.        {
56 56.            for(i = 1; i <= p * q; i++)
57 57.                printf("%c%d",path[i][1] - 1 + ‘A‘,path[i][0]);
58 58.        }
59 59.        else
60 60.            printf("impossible");
61 61.        printf("\n");
62 62.        if(n != 0)
63 63.            printf("\n");
64 64.    }
65 65.    return 0;
66 66.}  
时间: 2024-10-12 16:06:00

POJ 2488 深搜dfs、的相关文章

POJ 1321 深搜dfs

思路其实挺简单的,为什么我想不到呢!!! 原因分析:(1)题目还是做少了 (2)做题目的时候在放音乐 (3)最近脑袋都不愿意想思路总是想一些无用的 改进:(1)以后做题目坚决不开音乐,QQ直接挂隐身 (2)想题目的时候一定要认真,开启完全状态 (3)对自己再认真一点,加油 1 #include<cstdio> 2 #include<cstring> 3 const int qq=10; 4 char map[qq][qq]; 5 int vis[qq]; 6 int n,k,ans

poj1562 Oil Deposits(深搜dfs)

转载请注明出处:http://blog.csdn.net/u012860063?viewmode=contents 题目链接:http://poj.org/problem?id=1562 ---------------------------------------------------------------------------------------------------------------------------------------------------------- 欢

hdu1881 毕业bg(深搜dfs)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1881 Problem Description 每年毕业的季节都会有大量毕业生发起狂欢,好朋友们相约吃散伙饭,网络上称为"bg".参加不同团体的bg会有不同的感觉,我们可以用一个非负整数为每个bg定义一个"快乐度".现给定一个bg列表,上面列出每个bg的快乐度.持续长度.bg发起人的离校时间,请你安排一系列bg的时间使得自己可以获得最大的快乐度. 例如有4场bg: 第1场

hdu 1518 Square(深搜dfs)

转载请注明出处:http://blog.csdn.net/u012860063?viewmode=contents 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1518 --------------------------------------------------------------------------------------------------------------------------------------------

HDU 2553 N皇后问题(深搜DFS)

N皇后问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1757    Accepted Submission(s): 772   Problem Description 在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上.你的任务是,对于给定的N,求出

算法学习笔记 二叉树和图遍历—深搜 DFS 与广搜 BFS

图的深搜与广搜 马上又要秋招了,赶紧复习下基础知识.这里复习下二叉树.图的深搜与广搜.从图的遍历说起,图的遍历方法有两种:深度优先遍历(Depth First Search), 广度优先遍历(Breadth First Search),其经典应用走迷宫.N皇后.二叉树遍历等.遍历即按某种顺序访问"图"中所有的节点,顺序分为: 深度优先(优先往深处走),用的数据结构是栈, 主要是递归实现: 广度优先(优先走最近的),用的数据结构是队列,主要是迭代实现: 对于深搜,由于递归往往可以方便的利

深搜(DFS),回溯,Fire Net

题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=2 解题报告: 这里的深搜有一点不同,就是,在深搜每一个点时,都要深搜每一个点,就是一个完全二叉树. 借鉴:http://blog.csdn.net/zxy_snow/article/details/5952668 #include <stdio.h> #include <iostream> #include <stdlib.h> using

算法学习笔记(六) 二叉树和图遍历—深搜 DFS 与广搜 BFS

图的深搜与广搜 复习下二叉树.图的深搜与广搜. 从图的遍历说起.图的遍历方法有两种:深度优先遍历(Depth First Search), 广度优先遍历(Breadth First Search),其经典应用走迷宫.N皇后.二叉树遍历等.遍历即按某种顺序訪问"图"中全部的节点,顺序分为: 深度优先(优先往深处走),用的数据结构是栈, 主要是递归实现. 广度优先(优先走近期的).用的数据结构是队列.主要是迭代实现. 对于深搜.因为递归往往能够方便的利用系统栈,不须要自己维护栈.所以通常实

poj1321 棋盘问题(深搜dfs)

转载请注明出处:http://blog.csdn.net/u012860063? viewmode=contents 题目链接:id=1321">http://poj.org/problem?id=1321 -----------------------------------------------------------------------------------------------------------------------------------------------