말의 주법 SDUT

1598 단어 bfs

말의 걸음걸이


Time Limit: 1000ms Memory limit: 65536K여기를 누르세요^_^

제목 설명


4*5의 바둑판에서 말의 초기 위치 좌표(종횡) 위치는 키보드에 입력되어 말이 초기 위치의 모든 다른 주법의 총수를 되돌릴 수 있도록 한다.말의 초기 위치 좌표가 바둑판의 경계를 초과하면 ERROR이 출력됩니다.예를 들어 초기 위치가 46이면 ERROR이 출력됩니다.

입력


입력 데이터는 한 줄만 있고 공백으로 분리된 두 개의 정수가 있어 말이 있는 초기 위치 좌표를 나타낸다.첫 번째 줄의 첫 번째 열 위치 번호는 (1) 입니다.

출력


한 줄을 출력하면 하나의 정수만 있고 말이 초기 위치를 되돌릴 수 있는 모든 다른 주법의 총수를 나타낸다.
입력한 말의 초기 위치가 바둑판 경계를 벗어나면 ERROR이 출력됩니다.

예제 입력

2 2

예제 출력

4596

#include<iostream>
#include<cstdio>
#include<cstring>

using namespace std;
int n,m;
int vis[10][10];
int mx[]={-1,-2,-2,-1,1,2,2,1};
int my[]={2,1,-1,-2,-2,-1,1,2};
int s;
void f(int a,int b)
{
    int i,j,k;
    for(i=0;i<8;i++)
    {
        int cx=mx[i]+a;
        int cy=my[i]+b;
        if(cx==n&&cy==m)
        {
            s++;
        }
        else if( cx<=4&&cx>=1&&cy<=5&&cy>=1&&!vis[cx][cy])
        {
            vis[cx][cy]=1;
            f(cx,cy);
        }
    }
    vis[a][b]=0;//biao ji yao qing
}
int main()
{
    int i,j,k;
    while(cin>>n>>m)
    {
        s=0;
        memset(vis,0,sizeof(vis));
        if(n<=4&&n>=1&&m<=5&&m>=1)
        {
            vis[n][m]=1;
            f(n,m);
            cout<<s<<endl;
        }
        else
        cout<<"ERROR"<<endl;

    }
    return 0;
}

좋은 웹페이지 즐겨찾기