題目比較簡單。
注意看測試用例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
#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
由於題目最多是兩步,故結果只能是-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