PAT天梯赛L3-004 肿瘤诊断
生活随笔
收集整理的這篇文章主要介紹了
PAT天梯赛L3-004 肿瘤诊断
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目鏈接:點擊打開鏈接
Figure 1
#include<iostream> #include<queue> #include<algorithm> #include<stack> #include<string> #include<map> #include<set> #include<cstring> using namespace std; const int MAX = 1010; const int INF = 0X3f3f3f; bool arr[1300][130][80];//bool類型 不會超內存 bool vis[1300][130][80]; int X[6] = {1, 0, 0, -1, 0, 0};//訪問周圍的數組 int Y[6] = {0, 1, 0, 0, -1, 0}; int Z[6] = {0, 0, 1, 0, 0, -1};int n, m, l, t; struct node{int x;int y;int z;node() {}node(int _x, int _y, int _z):x(_x), y(_y), z(_z) {} };bool judge(int x, int y, int z) { //判斷該點是否需要訪問if(x < 0 || x >= n || y < 0 || y >= m || z < 0 || z >= l) return false;//出界if(arr[x][y][z] == false || vis[x][y][z] == true) return false;//該點為0 或者 被訪問過了 return true; }int bfs(int x, int y, int z) {int ans = 0;//記錄周圍1 的個數queue<node> q;//開隊列q.push(node(x, y, z));//起點壓入vis[x][y][z] = true;//標記訪問過while(!q.empty()) {//不為空 就一直繼續node top = q.front();//取出隊首元素q.pop();//清除隊首元素++ans;//在這里累加for(int i = 0; i < 6; i++) { // 用數組來訪問周圍的點int newx = top.x + X[i];int newy = top.y + Y[i];int newz = top.z + Z[i];if(judge(newx, newy, newz)) { // 判斷是否符合q.push(node(newx, newy, newz));//壓入vis[newx][newy][newz] = true;//標記}}}return ans >= t ? ans : 0; // 滿足閾值 就返回 }int main() {int i, j, k;// i, j, k 容易弄混 厚度 應該在最外層 也不要打錯cin >> n >> m >> l >> t;for(int i = 0; i < l; i++) {for(int j = 0; j < n; j++) {for(int k = 0; k < m; k++) {scanf("%d", &arr[j][k][i]);}}}int sum = 0;for(int i = 0; i < l; i++) {for(int j = 0; j < n; j++) {for(int k = 0; k < m; k++) {//這里的條件我剛開始用judge判的,出錯了if(arr[j][k][i] == true && vis[j][k][i] == false) {sum += bfs(j, k, i);}}}}cout << sum;return 0; }
在診斷腫瘤疾病時,計算腫瘤體積是很重要的一環。給定病灶掃描切片中標注出的疑似腫瘤區域,請你計算腫瘤的體積。
輸入格式:
輸入第一行給出4個正整數:M、N、L、T,其中M和N是每張切片的尺寸(即每張切片是一個M×N的像素矩陣。最大分辨率是1286×128);L(<=60)是切片的張數;T是一個整數閾值(若疑似腫瘤的連通體體積小于T,則該小塊忽略不計)。
最后給出L張切片。每張用一個由0和1組成的M×N的矩陣表示,其中1表示疑似腫瘤的像素,0表示正常像素。由于切片厚度可以認為是一個常數,于是我們只要數連通體中1的個數就可以得到體積了。麻煩的是,可能存在多個腫瘤,這時我們只統計那些體積不小于T的。兩個像素被認為是“連通的”,如果它們有一個共同的切面,如下圖所示,所有6個紅色的像素都與藍色的像素連通。
Figure 1
輸出格式:
在一行中輸出腫瘤的總體積。
輸入樣例:3 4 5 2 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 0 0 1 1 0 0 1 1 1 0 1 1 0 1 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 輸出樣例:26 思路:看到樣例就是要廣搜。題意中是立體的,所以要用三維數組存儲。 還有就是 只看周圍的六個方向,不帶自己。AC代碼:#include<iostream> #include<queue> #include<algorithm> #include<stack> #include<string> #include<map> #include<set> #include<cstring> using namespace std; const int MAX = 1010; const int INF = 0X3f3f3f; bool arr[1300][130][80];//bool類型 不會超內存 bool vis[1300][130][80]; int X[6] = {1, 0, 0, -1, 0, 0};//訪問周圍的數組 int Y[6] = {0, 1, 0, 0, -1, 0}; int Z[6] = {0, 0, 1, 0, 0, -1};int n, m, l, t; struct node{int x;int y;int z;node() {}node(int _x, int _y, int _z):x(_x), y(_y), z(_z) {} };bool judge(int x, int y, int z) { //判斷該點是否需要訪問if(x < 0 || x >= n || y < 0 || y >= m || z < 0 || z >= l) return false;//出界if(arr[x][y][z] == false || vis[x][y][z] == true) return false;//該點為0 或者 被訪問過了 return true; }int bfs(int x, int y, int z) {int ans = 0;//記錄周圍1 的個數queue<node> q;//開隊列q.push(node(x, y, z));//起點壓入vis[x][y][z] = true;//標記訪問過while(!q.empty()) {//不為空 就一直繼續node top = q.front();//取出隊首元素q.pop();//清除隊首元素++ans;//在這里累加for(int i = 0; i < 6; i++) { // 用數組來訪問周圍的點int newx = top.x + X[i];int newy = top.y + Y[i];int newz = top.z + Z[i];if(judge(newx, newy, newz)) { // 判斷是否符合q.push(node(newx, newy, newz));//壓入vis[newx][newy][newz] = true;//標記}}}return ans >= t ? ans : 0; // 滿足閾值 就返回 }int main() {int i, j, k;// i, j, k 容易弄混 厚度 應該在最外層 也不要打錯cin >> n >> m >> l >> t;for(int i = 0; i < l; i++) {for(int j = 0; j < n; j++) {for(int k = 0; k < m; k++) {scanf("%d", &arr[j][k][i]);}}}int sum = 0;for(int i = 0; i < l; i++) {for(int j = 0; j < n; j++) {for(int k = 0; k < m; k++) {//這里的條件我剛開始用judge判的,出錯了if(arr[j][k][i] == true && vis[j][k][i] == false) {sum += bfs(j, k, i);}}}}cout << sum;return 0; }
轉載于:https://www.cnblogs.com/ACMerszl/p/9573003.html
總結
以上是生活随笔為你收集整理的PAT天梯赛L3-004 肿瘤诊断的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 比特币的入门教程
- 下一篇: css position left 50