Define the relation : ada at end ist Item, Newilist) to add Item at the end of List producing Newlist. Let both lists be represented by defference pairs.
Очевидно, решения нет, если нужно выпустить ровно K = NM - 1 человека: он должен перейти в какую-то комнату, но из всех комнат, кроме его, есть путь наружу.
При всех остальных K можно, например, поступить так:
- отсчитать сверху и слева направо K комнат, в них открыть дверь вверх
- в оставшихся комнатах, не находящихся в нижнем ряду, открыть путь вниз
- в оставшихся комнатах нижнего ряда, кроме правого нижнего угла, открыть дверь вправо
- в правом нижнем углу, если там ещё не открыта дверь, открыть дверь влево
В итоге K человек уйдут с территории через верх, а остальные будут бесконечно ходить между двумя комнатами в правом нижнем углу.
Код (python 3):
N, M, K = map(int, input().split())
if K == N * M - 1:
print("IMPOSSIBLE")
elif K == N * M:
for _ in range(N):
print("U" * M)
else:
for _ in range(K // M):
print("U" * M)
if K // M < N - 1:
print("U" * (K % M) + "D" * (M - K % M))
for __ in range(N - 1 - K // M):
print("D" * M)
print("R" * (M - 1) + "L")
else:
print("U" * (K % M) + "R" * (M - K % M - 1) + "L")
#include<bits/stdc++.h>
using namespace std;
int main(){
int n,m,k;
cin>>n>>m>>k;
if(k==m*n-1){
cout<<"IMPOSSIBLE";
return 0;
}
char a[n][m];
for(int i = 0; i<n; i++){
for(int j = 0; j<m; j++){
if(k>0){
a[i][j]='U';
k--;
cout<<'U';
} else if((a[i-1][j]=='U' || i==0) && i==n-1 && j!=m-1){
cout<<'R';
} else if((a[i-1][j]=='U' || i==0) && i==n-1 && j==m-1){
a[i][j] = 'L';
cout<<'L';
} else if(i==n-1 && a[i-1][j]!='U') {
cout<<'U';
} else {
cout<<'D';
}
}
cout<<endl;
}
return 0;
}
Объяснение
код написан на языке с++;
есть 5 случаев которые приведены в картинках ниже + случай когда n*m-1=k выводит Impossible
Очевидно, решения нет, если нужно выпустить ровно K = NM - 1 человека: он должен перейти в какую-то комнату, но из всех комнат, кроме его, есть путь наружу.
При всех остальных K можно, например, поступить так:
- отсчитать сверху и слева направо K комнат, в них открыть дверь вверх
- в оставшихся комнатах, не находящихся в нижнем ряду, открыть путь вниз
- в оставшихся комнатах нижнего ряда, кроме правого нижнего угла, открыть дверь вправо
- в правом нижнем углу, если там ещё не открыта дверь, открыть дверь влево
В итоге K человек уйдут с территории через верх, а остальные будут бесконечно ходить между двумя комнатами в правом нижнем углу.
Код (python 3):
N, M, K = map(int, input().split())
if K == N * M - 1:
print("IMPOSSIBLE")
elif K == N * M:
for _ in range(N):
print("U" * M)
else:
for _ in range(K // M):
print("U" * M)
if K // M < N - 1:
print("U" * (K % M) + "D" * (M - K % M))
for __ in range(N - 1 - K // M):
print("D" * M)
print("R" * (M - 1) + "L")
else:
print("U" * (K % M) + "R" * (M - K % M - 1) + "L")