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:
",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("
");
56         if(t!=0)    printf("
"); 
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:
",++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("
");  
62 62.        if(n != 0)  
63 63.            printf("
");  
64 64.    }  
65 65.    return 0;  
66 66.}  
原文地址:https://www.cnblogs.com/sasuke-/p/5179066.html