topcoder SRM 628 DIV2 BishopMove

OpenSoucre發表於2014-07-23

題目比較簡單。

注意看測試用例2,給的提示

Please note that this is the largest possible return value: whenever there is a solution, there is a solution that uses at most two moves.

最多隻有兩步

#include <vector>
#include <string>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <stack>
#include <bitset>
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <cstring>
#include <climits>
#include <queue>

using namespace std;

class BishopMove
{
public:
    typedef pair<int,int> Point;
    int howManyMoves(int r1, int c1, int r2, int c2)
    {
        queue<Point> que;
        que.push(Point(r1,c1));
        int step = 0;
        bool visit[8][8];
        memset(visit,false,sizeof(visit));
        int dx[]={1,-1,1,-1};
        int dy[]={1,1,-1,-1};
        while(!que.empty()){
            int cnt = que.size();
            while(cnt-->0){
                Point tmp = que.front();que.pop();
                visit[tmp.first][tmp.second] = true;
                if(tmp.first == r2 && tmp.second == c2) return step;
                for(int k = 1; k < 8 ; ++ k){
                    for(int i = 0 ; i  < 4; ++ i){
                        int x = tmp.first+dx[i]*k,y=tmp.second+dy[i]*k;
                        if(x>=0 && x < 8 && y>=0 && y<8 && !visit[x][y]) que.push(Point(x,y));
                    }
                }
            }
            step++;
        }
        return -1;
    }


};


// Powered by FileEdit
// Powered by TZTester 1.01 [25-Feb-2003]
// Powered by CodeProcessor
BFS解法
#include <vector>
#include <string>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <stack>
#include <bitset>
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <cstring>
#include <climits>
#include <queue>

using namespace std;

class BishopMove
{
public:
    typedef pair<int,int> Point;
    bool visit[8][8];
    Point start,endp;
    int res;
    const int dx[4]={1,-1,1,-1};
    const int dy[4]={1,1,-1,1 };
    void dfs(Point pos,int step){
        if(pos.first == endp.first && pos.second == endp.second){
            res=min(res,step);
            return;
        }
        if(step > res) return;
        for(int k = 1 ; k < 8; ++ k){
            for(int i = 0 ; i < 4; ++ i){
                int x = pos.first+k*dx[i], y =pos.second+k*dy[i];
                if(x>=0 && x< 8 && y>=0 && y < 8 && !visit[x][y]){
                    visit[x][y] = true;
                    dfs(Point(x,y),step+1);
                    visit[x][y] = false;
                }
            }
        }
    }

    int howManyMoves(int r1, int c1, int r2, int c2)
    {
        memset(visit,false,sizeof(visit));
        start.first = r1;start.second =c1;
        endp.first = r2; endp.second = c2;
        res = 1000;
        visit[r1][c1] = true;
        dfs(start,0);
        if(res == 1000) res=-1;
        return res;
    }

// BEGIN CUT HERE
    public:
    void run_test(int Case) { if ((Case == -1) || (Case == 0)) test_case_0(); if ((Case == -1) || (Case == 1)) test_case_1(); if ((Case == -1) || (Case == 2)) test_case_2(); if ((Case == -1) || (Case == 3)) test_case_3(); }
    private:
    template <typename T> string print_array(const vector<T> &V) { ostringstream os; os << "{ "; for (typename vector<T>::const_iterator iter = V.begin(); iter != V.end(); ++iter) os << '\"' << *iter << "\","; os << " }"; return os.str(); }
    void verify_case(int Case, const int &Expected, const int &Received) { cerr << "Test Case #" << Case << "..."; if (Expected == Received) cerr << "PASSED" << endl; else { cerr << "FAILED" << endl; cerr << "\tExpected: \"" << Expected << '\"' << endl; cerr << "\tReceived: \"" << Received << '\"' << endl; } }
    void test_case_0() { int Arg0 = 4; int Arg1 = 6; int Arg2 = 7; int Arg3 = 3; int Arg4 = 1; verify_case(0, Arg4, howManyMoves(Arg0, Arg1, Arg2, Arg3)); }
    void test_case_1() { int Arg0 = 2; int Arg1 = 5; int Arg2 = 2; int Arg3 = 5; int Arg4 = 0; verify_case(1, Arg4, howManyMoves(Arg0, Arg1, Arg2, Arg3)); }
    void test_case_2() { int Arg0 = 1; int Arg1 = 3; int Arg2 = 5; int Arg3 = 5; int Arg4 = 2; verify_case(2, Arg4, howManyMoves(Arg0, Arg1, Arg2, Arg3)); }
    void test_case_3() { int Arg0 = 4; int Arg1 = 6; int Arg2 = 7; int Arg3 = 4; int Arg4 = -1; verify_case(3, Arg4, howManyMoves(Arg0, Arg1, Arg2, Arg3)); }

// END CUT HERE

};
// BEGIN CUT HERE
int main()
{
    BishopMove ___test;
    ___test.run_test(-1);
}
// END CUT HERE
DFS解法

由於題目最多是兩步,故結果只能是-1,0,1,2

當兩個位置的奇偶性不同時,結果是-1,

當兩個位置相等時是0

當abs(c) 與abs(r)相等的視乎,結果是1

其他結果是2

#include <vector>
#include <string>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <stack>
#include <bitset>
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <cstring>
#include <climits>
#include <queue>

using namespace std;

class BishopMove
{
public:
    int howManyMoves(int r1, int c1, int r2, int c2)
    {
        if(((r1+c1)%2) ^ ((r2+c2)%2) ) return -1;
        if(r1==r2 && c1 == c2 ) return 0;
        if(abs(r2-r1) == abs(c2-c1)) return 1;
        return 2;
    }
};


// Powered by FileEdit
// Powered by TZTester 1.01 [25-Feb-2003]
// Powered by CodeProcessor
View Code

相關文章