这个题目的突破口就是固定最短长度,然后以二进制的形式分层;
最后把需要的曾连起来;
#include<cstdio> #include<cstring> #define maxn 105 using namespace std; bool map[maxn][maxn]; void link(int x,int y) { map[x][y]=1; map[y][x]=1; } void pre() { link(1,3); link(1,4); link(2,100); for(int i=3; i<60; i+=2) { link(i,i+2); link(i,i+3); link(i+1,i+2); link(i+1,i+3); } for(int i=63; i<100; i++) link(i,i+1); } void solve(int k) { for(int i=1; i<=30; i++) { if(1<<i&k) { link(2*i+1,63+i); link(2*i+2,63+i); } } if(k&1)link(1,63); printf("100\n"); for(int i=1; i<=100; i++) { for(int j=1; j<=100; j++) { if(map[i][j]) putchar(‘Y‘); else putchar(‘N‘); } puts(""); } } int main() { pre(); int k; scanf("%d",&k); solve(k); return 0; }
codeforces 388B Fox and Minimal path
原文:http://www.cnblogs.com/yours1103/p/3560648.html