zoukankan      html  css  js  c++  java
  • ACM之马踏棋盘(DFS)

    #include<stdio.h>
    #include<string.h>
    int visit[5][5];
    int a[5][5];//记录所存储的的第几步的数值,例如在a[2][2]是第三步,a[2][2]=3;
    //应该是八个方向,自己可以画图看,相对于自己的位置横纵坐标相差多少
    int X[8]= {2,-1,1,-2,2,1,-1,-2};
    int Y[8]= {1,2,2,1,-1,-2,-2,-1};
    int count;//路的方法计数器
    int n;    //走的步数计数器
    void dfs(int x,int y)
    {
        if(n==25)    //递归结束条件
        {
            for(int i=0; i<5; i++)
            {
                for(int j=0; j<5; j++)
                    printf("%d ",a[i][j]);
                printf("
    ");
            }
            count++;
            return;
        }
        for(int k=0; k<8; k++)//八个方向依次遍历
        {
            if((x+X[k]>=0)&&(x+X[k]<5)&&(y+Y[k]>=0)&&(y+Y[k]<5)&&(visit[x+X[k]][y+Y[k]]==0))//检查是否符合规则
            {
                n++;//步数加1
                a[x+X[k]][y+Y[k]]=n;    //记录第几步的数值和路径
                visit[x+X[k]][y+Y[k]]=1;// 标记已经走过
                dfs(x+X[k],y+Y[k]);     
                visit[x+X[k]][y+Y[k]]=0; //恢复现场
                n--;
            }
        }
    }
    int main()
    {
        int x,y;
        while(~scanf("%d%d",&x,&y))
        {
            memset(visit,0,sizeof(visit));
            count=0;
            visit[x][y]=1;
            n=1;
            a[x][y]=n;
            dfs(x,y);
            printf("%d
    ",count);
        }
        return 0;
    }
  • 相关阅读:
    bzoj1295 [SCOI2009]最长距离
    bzoj1853 [Scoi2010]幸运数字
    bzoj1855 [Scoi2010]股票交易
    bzoj1294 [SCOI2009]围豆豆
    bzoj1237 [SCOI2008]配对
    bzoj1084 [SCOI2005]最大子矩阵
    bzoj1068 [SCOI2007]压缩
    bzoj1082 [SCOI2005]栅栏
    soj97 旅行
    soj98 卡牌
  • 原文地址:https://www.cnblogs.com/calmwithdream/p/5317213.html
Copyright © 2011-2022 走看看