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("\n");
        }
        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\n",count);
    }
    return 0;
}

 

posted @ 2016-03-24 21:17  请叫我凯凯大人  阅读(451)  评论(0编辑  收藏  举报