# 實作題 - 人口遷移 - APCS - by Peter Wang
## 題目資訊
此題為2020.10測驗中的題目2
###### tags: `APCS`
## 題目敘述
R×C 的平面上有一些城市,每天每個城市會向每個它相鄰的城市遷移 人數k 個人(整數除法,無條件捨去),請模擬出 m 天之後的結果,輸出人數最少及最多的城市人數。
城市人數若為 −1 則代表該位置並非城市,不能由任何城市遷移至此。
下圖是第一筆範例測資模擬的結果

### 輸入:
輸入的第一行包含四個正整數 R,C,k,m,(1≤R,C,m≤50,4≤k≤50)
接下來包含 R 行,每行包含 C 個整數,對於第 i 行的第 j 個整數 ai,j(−1≤ai,j≤100),如果是 -1 表示這個座標沒有城市,否則表示這個座標的城市人數數量,保證是非負整數。
### 輸出:
第一行,輸出在 m 天之後,人數最少的城市的人數。
第二行,輸出在 m 天之後,人數最多的城市的人數。
## 解題思路
按照題目給的資訊耐心實作,如果有比較好的解法歡迎分享。
## 程式碼
```clike=
#include<iostream>
#include<math.h>
#include<string.h>
using namespace std;
int main(){
int r,c,k,m;
while(cin>>r){
cin>>c>>k>>m;
int arr[52][52];
int arr2[52][52];
memset(arr,-1,sizeof(arr));
memset(arr2,-1,sizeof(arr2));
for(int i=1;i<=r;i++){
for(int j=1;j<=c;j++){
cin>>arr[i][j];
arr2[i][j]=arr[i][j];
}
}
int x=0;
for(int p=0;p<m;p++){
for(int i=1;i<=r;i++){
for(int j=1;j<=c;j++){
x=floor(arr2[i][j]/k);
if(arr[i][j]==-1){
continue;
}
else if(i==1 && j==1){
if(arr[i+1][j]!=-1){
arr[i+1][j]+=x;
arr[i][j]-=x;
}
if(arr[i][j+1]!=-1){
arr[i][j+1]+=x;
arr[i][j]-=x;
}
else{
continue;
}
}
else if(i==r && j==c){
if(arr[i-1][j]!=-1){
arr[i-1][j]+=x;
arr[i][j]-=x;
}
if(arr[i][j-1]!=-1){
arr[i][j-1]+=x;
arr[i][j]-=x;
}
else{
continue;
}
}
else if(i==r && j==1){
if(arr[i-1][j]!=-1){
arr[i-1][j]+=x;
arr[i][j]-=x;
}
if(arr[i][j+1]!=-1){
arr[i][j+1]+=x;
arr[i][j]-=x;
}
else{
continue;
}
}
else if(i==1 && j==c){
if(arr[i+1][j]!=-1){
arr[i+1][j]+=x;
arr[i][j]-=x;
}
if(arr[i][j-1]!=-1){
arr[i][j-1]+=x;
arr[i][j]-=x;
}
else{
continue;
}
}
else if(i==1){
if(arr[i+1][j]!=-1){
arr[i+1][j]+=x;
arr[i][j]-=x;
}
if(arr[i][j+1]!=-1){
arr[i][j+1]+=x;
arr[i][j]-=x;
}
if(arr[i][j-1]!=-1){
arr[i][j-1]+=x;
arr[i][j]-=x;
}
else{
continue;
}
}
else if(i==r){
if(arr[i-1][j]!=-1){
arr[i-1][j]+=x;
arr[i][j]-=x;
}
if(arr[i][j+1]!=-1){
arr[i][j+1]+=x;
arr[i][j]-=x;
}
if(arr[i][j-1]!=-1){
arr[i][j-1]+=x;
arr[i][j]-=x;
}
else{
continue;
}
}
else if(j==1){
if(arr[i+1][j]!=-1){
arr[i+1][j]+=x;
arr[i][j]-=x;
}
if(arr[i][j+1]!=-1){
arr[i][j+1]+=x;
arr[i][j]-=x;
}
if(arr[i-1][j]!=-1){
arr[i-1][j]+=x;
arr[i][j]-=x;
}
else{
continue;
}
}
else if(j==c){
if(arr[i+1][j]!=-1){
arr[i+1][j]+=x;
arr[i][j]-=x;
}
if(arr[i][j-1]!=-1){
arr[i][j-1]+=x;
arr[i][j]-=x;
}
if(arr[i-1][j]!=-1){
arr[i-1][j]+=x;
arr[i][j]-=x;
}
else{
continue;
}
}
else{
if(arr[i][j-1]!=-1){
arr[i][j-1]+=x;
arr[i][j]-=x;
}
if(arr[i][j+1]!=-1){
arr[i][j+1]+=x;
arr[i][j]-=x;
}
if(arr[i-1][j]!=-1){
arr[i-1][j]+=x;
arr[i][j]-=x;
}
if(arr[i+1][j]!=-1){
arr[i+1][j]+=x;
arr[i][j]-=x;
}
else{
continue;
}
}
}
}
memset(arr2,-1,sizeof(arr2));
for(int i=1;i<=r;i++){
for(int j=1;j<=c;j++){
arr2[i][j]=arr[i][j];
}
}
memset(arr,-1,sizeof(arr));
for(int i=1;i<=r;i++){
for(int j=1;j<=c;j++){
arr[i][j]=arr2[i][j];
}
}
}
long long max=-1000000;
long long min=1000000;
for(int i=1;i<=r;i++){
for(int j=1;j<=c;j++){
if(arr[i][j]==-1){
continue;
}
if(arr[i][j]>max){
max=arr[i][j];
}
if(arr[i][j]<min){
min=arr[i][j];
}
else{
continue;
}
}
}
cout<<min<<endl;
cout<<max<<endl;
}
}
```
## 資料來源
[zerojudge](https://zerojudge.tw/)
[題目敘述](https://zerojudge.tw/ShowProblem?problemid=f313)
## 備註
>[name=PeterWang]
>[time=Fri, Jun 18, 2021 9:59 PM]