题意:模拟国际象棋中马的走棋方式,其实和中国象棋的马走的方式其实是一样的,马可以从给定的方格棋盘中任意点开始,问是否能遍历全部格子,能的话输出字典序最小的走棋方式,否则输出impossible
思路:只要能遍历全部的格子,就一定会走A1这个点,而且这个点的字典序是最小的,保证了这点的话还需要保证dfs的8个方向也要按照字典序最小来走,这样就可以确保所走的路径就是字典序最小的
坑爹:自己忘记输出Scenario #i,一连WA了几发,就是不知道自己错在哪里,顺便发一个对照的程序吧我的程序过16MS,他的程序0MS
先贴自己的
1 #include<cstdio> 2 #include<cstring> 3 #include<cmath> 4 const int qq=100; 5 int vis[qq][qq]; 6 int dx[]={-2,-2,-1,-1,1,1,2,2}, 7 dy[]={-1,1,-2,2,-2,2,-1,1}; 8 int map[qq][qq]; 9 int n,m,flag,ans; 10 int check(int y,int x) 11 { 12 if(x<1||y<1||x>m||y>n||map[y][x]) 13 return 1; 14 return 0; 15 } 16 void dfs(int y,int x,int step) 17 { 18 if(flag) return; 19 if(check(y,x)) return; 20 vis[step][0]=x; 21 vis[step][1]=y; 22 if(step==n*m){ 23 flag=1; 24 ans=step; 25 return; 26 } 27 for(int i=0;i<8;++i){ 28 map[y][x]=1; 29 dfs(y+dy[i],x+dx[i],step+1); 30 map[y][x]=0; 31 } 32 return; 33 } 34 int main() 35 { 36 int t,o=1;scanf("%d",&t); 37 while(t--) 38 { 39 flag=0; 40 scanf("%d%d",&n,&m); 41 memset(vis,0,sizeof(vis)); 42 memset(map,0,sizeof(map)); 43 ans=0; 44 dfs(1,1,1); 45 printf("Scenario #%d:\n",o++); 46 if(ans!=n*m){ 47 printf("impossible"); 48 } 49 else{ 50 for(int i=1;i<=ans;++i){ 51 printf("%c",vis[i][0]+‘A‘-1); 52 printf("%d",vis[i][1]); 53 } 54 } 55 printf("\n"); 56 if(t!=0) printf("\n"); 57 } 58 return 0; 59 }
1 #include<cstdio> 2 02.#include<cstring> 3 03.#include<algorithm> 4 04.using namespace std; 5 05. 6 06.int path[88][88], vis[88][88], p, q, cnt; 7 07.bool flag; 8 08. 9 09.int dx[8] = {-1, 1, -2, 2, -2, 2, -1, 1}; 10 10.int dy[8] = {-2, -2, -1, -1, 1, 1, 2, 2}; 11 11. 12 12.bool judge(int x, int y) 13 13.{ 14 14. if(x >= 1 && x <= p && y >= 1 && y <= q && !vis[x][y] && !flag) 15 15. return true; 16 16. return false; 17 17.} 18 18. 19 19.void DFS(int r, int c, int step) 20 20.{ 21 21. path[step][0] = r; 22 22. path[step][1] = c; 23 23. if(step == p * q) 24 24. { 25 25. flag = true; 26 26. return ; 27 27. } 28 28. for(int i = 0; i < 8; i++) 29 29. { 30 30. int nx = r + dx[i]; 31 31. int ny = c + dy[i]; 32 32. if(judge(nx,ny)) 33 33. { 34 34. 35 35. vis[nx][ny] = 1; 36 36. DFS(nx,ny,step+1); 37 37. vis[nx][ny] = 0; 38 38. } 39 39. } 40 40.} 41 41. 42 42.int main() 43 43.{ 44 44. int i, j, n, cas = 0; 45 45. scanf("%d",&n); 46 46. while(n--) 47 47. { 48 48. flag = 0; 49 49. scanf("%d%d",&p,&q); 50 50. memset(vis,0,sizeof(vis)); 51 51. vis[1][1] = 1; 52 52. DFS(1,1,1); 53 53. printf("Scenario #%d:\n",++cas); 54 54. if(flag) 55 55. { 56 56. for(i = 1; i <= p * q; i++) 57 57. printf("%c%d",path[i][1] - 1 + ‘A‘,path[i][0]); 58 58. } 59 59. else 60 60. printf("impossible"); 61 61. printf("\n"); 62 62. if(n != 0) 63 63. printf("\n"); 64 64. } 65 65. return 0; 66 66.}
时间: 2024-10-12 16:06:00