codeforces gym 100825 D Rings
这题果然就是个暴力题....
看每个T的四个方向,有'.',或者在边界上就填1
不然就填四个方向上最小的那个数再加1
然而写wa了几发,有点蠢...
1 #include <bits/stdc++.h> 2 3 using namespace std; 4 5 char a[105][105]; 6 int vis[105][105]; 7 8 int dir[4][2] = {0,1,0,-1,1,0,-1,0}; 9 int n,m; 10 11 bool ok(int x,int y) { 12 if(x < 1 || y < 1 || x > n || y > m) { 13 return false; 14 } 15 return true; 16 } 17 int main() { 18 19 20 21 cin>>n>>m; 22 memset(vis,101,sizeof(vis)); 23 for(int i = 1; i <= n; i++) { 24 scanf("%s",a[i] + 1); 25 26 } 27 for(int i = 1; i <= 101; i++) { 28 for(int j = 1; j <= 101; j++) { 29 vis[i][j] = 101; 30 } 31 } 32 33 34 for(int k = 1; k <= 100; k++) { 35 for(int i = 1; i <= n; i++) { 36 for(int j = 1; j <= m; j++) { 37 if(a[i][j] == 'T') { 38 for(int x = 0; x < 4; x++) { 39 int nx = i + dir[x][0]; 40 int ny = j + dir[x][1]; 41 if(!ok(nx,ny)) { 42 /*if(i == 2 && j == 17) { 43 cout<<vis[nx][ny]<<endl; 44 }*/ 45 vis[i][j] = 1; 46 break; 47 } 48 if(ok(nx,ny) && a[nx][ny] == '.') { 49 50 vis[i][j] = 1; 51 break; 52 53 } 54 else if(ok(nx,ny) && vis[nx][ny] != 101) { 55 56 vis[i][j] = min(vis[i][j],vis[nx][ny] + 1); 57 } 58 } 59 } 60 } 61 } 62 63 } 64 65 int cnt = 1; 66 for(int i = 1; i <= n; i++) { 67 for(int j = 1; j <= m; j++) { 68 if(vis[i][j] != 101) { 69 cnt = max(cnt,vis[i][j]); 70 } 71 } 72 } 73 74 //cout<<cnt<<endl; 75 if(cnt < 10) { 76 for(int i = 1; i <= n; i++) { 77 for(int j = 1; j <= m; j++) { 78 //cout<<vis[i][j]<<' '; 79 if(vis[i][j] == 101) { 80 printf(".."); 81 } 82 else { 83 printf("."); 84 printf("%d",vis[i][j]); 85 } 86 87 } 88 printf("\n"); 89 } 90 } 91 else { 92 for(int i = 1; i <= n; i++) { 93 for(int j = 1; j <= m; j++) { 94 if(vis[i][j] == 101) { 95 printf("..."); 96 } 97 else if(vis[i][j] < 10) { 98 printf(".."); 99 printf("%d",vis[i][j]); 100 } 101 else { 102 printf("."); 103 printf("%d",vis[i][j]); 104 } 105 106 } 107 printf("\n"); 108 } 109 } 110 111 }