//最短路径问题 //求一个迷宫的入口和出口间的最短路径的长度 //约束条件:迷宫中0的点可以走,1的点是障碍,不能走 //每次移动只能上、下、左、右移动1个位置,路径不能产生交叉 //僵尸传染: //用二维数组表示一个地图,地图上为1的点代表有人,为0的点代表空地 //开始时,只有一个人被病毒感染,变成了僵尸 //变成僵尸的人可以传染其他人,每一秒可以上、下、左、右四个方向距离为1的人传染 //求最终有多少人被感染,使用多长时间 // 1 1 1 1 1 1 1 1 1 1 // 1 1 1 1 1 1 1 1 1 1 // 1 1 1 1 5 1 1 1 1 1 // 1 1 1 5 4 5 1 1 1 1 // 1 1 5 4 3 4 5 1 1 1 // 1 5 4 3 2 3 4 5 1 1 // 1 1 5 4 3 4 5 1 1 1 // 1 1 1 5 4 5 1 1 1 1 // 1 1 1 1 5 1 1 1 1 1 // 1 1 1 1 1 1 1 1 1 1 // 1 1 1 1 1 1 1 1 1 1 // 1 1 1 1 1 1 1 1 1 1 //int curStep; //BFS可以求的内容: //源点能否到达某一个点 //源点到所有其他点的最短路径的距离 //可以记录一条最短路径(但只能记录一条) #include <iostream> using namespace std; #define SIZE 1000 int map[SIZE][SIZE]; int dx[4] = {0, 1, 0, -1}; int dy[4] = {1, 0, -1, 0}; void infect(int sx, int sy){ int curStep = 2; map[sx][sy] = curStep; while(1){ int getNewPeople = 0; for(int i = 0; i < SIZE; i++){ for(int j = 0; j < SIZE; j++){ if(map[i][j] == curStep){ for(int k = 0; k < 4; k++){ int nx = i + dx[k]; int ny = j + dy[k]; if(nx < SIZE && nx >= 0 && ny < SIZE && ny >= 0 && map[nx][ny] == 1){ map[nx][ny] = curStep + 1; getNewPeople = 1; } } } } } if(getNewPeople == 0) break; curStep++; } } struct node{ int x; int y; }; node Nodes[SIZE * SIZE]; int head = 0; int tail = 0; void zombbieInfect(int sx, int sy){ int curStep = 2; map[sx][sy] = curStep; node tmpNode; tmpNode.x = sx; tmpNode.y = sy; Nodes[tail] = tmpNode; tail++; while(head < tail){ node curNode = Nodes[head]; head++; for(int k = 0; k < 4; k++){ int nx = curNode.x + dx[k]; int ny = curNode.y + dy[k]; if(nx < SIZE && nx >= 0 && ny < SIZE && ny >= 0 && map[nx][ny] == 1){ map[nx][ny] = map[curNode.x][curNode.y] + 1; tmpNode.x = nx; tmpNode.y = ny; Nodes[tail] = tmpNode; tail++; } } } } int main(){ for(int i = 0; i < SIZE; i++){ for(int j = 0; j < SIZE; j++){ map[i][j] = 1; } } zombbieInfect(5, 5); //for(int i = 0; i < SIZE; i++){ // for(int j = 0; j < SIZE; j++){ // cout << map[i][j] << " "; // } // cout << endl; //} return 0; }
时间: 2024-11-14 08:48:57