| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
【数字】我的解答,没做出来的看看。主要还是枚举!
#include <fstream>
#include <iostream>
#include <algorithm>
using namespace std;
int mat_dist_kn[65][65];
int mat_dist_ki[65][65];
int dir_kn_x[8] = {-2,-2,-1,-1,1,1,2,2};
int dir_kn_y[8] = {-1,1,-2,2,-2,2,-1,1};
int dir_ki_x[8] = {-1,-1,-1,0,0,1,1,1};
int dir_ki_y[8] = {-1,0,1,-1,1,-1,0,1};
int num_kn;
int ar[65];
int pos_ki;
const static int c_max = 1000000;
int get_id(int r,int c)
{
return r*8 + c;
}
void get_r_c(int id,int &r,int &c)
{
r = id/8;
c = id%8;
}
bool check_in_board(int r,int c)
{
return (r >= 0) && (r < 8) && (c >=0 ) && (c < 8);
}
void gh_floyd(int map[][65])
{
for(int cnt = 0;cnt<64;cnt++)
{
for(int cnt_r = 0;cnt_r<64;cnt_r++)
{
for(int cnt_c=0;cnt_c<64;cnt_c++)
{
if (map[cnt_r][cnt] + map[cnt][cnt_c] < map[cnt_r][cnt_c])
map[cnt_r][cnt_c] = map[cnt_r][cnt] + map[cnt][cnt_c];
}
}
}
}
void init_map(int gh[][65],int dir_x[],int dir_y[])
{
for(int cn_src=0;cn_src<64;cn_src++)
{
for(int cn_des=0;cn_des<64;cn_des++)
{
gh[cn_src][cn_des] = c_max;
}
}
for(int cnt_pos=0;cnt_pos<64;cnt_pos++)
{
gh[cnt_pos][cnt_pos] = 0;
int r,c;
get_r_c(cnt_pos,r,c);
for(int cnt_dir=0;cnt_dir<8;cnt_dir++)
{
int next_r = r + dir_x[cnt_dir];
int next_c = c + dir_y[cnt_dir];
if (!check_in_board(next_r,next_c))
{
continue;
}
int next_id = get_id(next_r,next_c);
gh[next_id][cnt_pos] = gh[cnt_pos][next_id] = 1;
}
}
}
void init_all()
{
init_map(mat_dist_kn,dir_kn_x,dir_kn_y);
gh_floyd(mat_dist_kn);
init_map(mat_dist_ki,dir_ki_x,dir_ki_y);
gh_floyd(mat_dist_ki);
}
int main(int argc, char* argv[])
{
ifstream fin("D:\\acm\\try_1178.txt");
char a,b;
fin>>a>>b;
pos_ki = get_id(a -'A',b - '1');
while(fin)
{
fin>>a>>b;
ar[num_kn++] = get_id(a - 'A',b - '1');
}
num_kn --;
if (num_kn == 0)
cout<<"0"<<endl;
init_all();
int ans= c_max;
for(int cnt_des=0;cnt_des<64;cnt_des++)
{
int sum = 0;
for(int cnt=0;cnt<num_kn;cnt++)
{
sum += mat_dist_kn[cnt_des][ar[cnt]];
}
for(int cnt_kn=0;cnt_kn<num_kn;cnt_kn++)
{
for(int cnt_join=0;cnt_join<64;cnt_join++)
{
int cur_res = sum + mat_dist_ki[cnt_join][pos_ki] - mat_dist_kn[cnt_des][ar[cnt_kn]] + mat_dist_kn[cnt_des][cnt_join] + mat_dist_kn[cnt_join][ar[cnt_kn]];
if (cur_res < ans)
ans = cur_res;
}
}
}
cout<<ans<<endl;
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator