#533
D. Kilani and the Game
模拟一个游戏,每轮每个玩家可以把距离他拥有的领地的ki步内的格子占领,不能跨越别人的领地以及障碍,问最终每个人占领多少个格子。
写了好几种写法,然后调完才发现是不对的。
最终写了分轮dfs,每个人都有一个bfs队列。对于每一轮知道玩家占领格子的最远距离,当队列头是这些格子时就break出去,下一轮才会考虑从这些格子拓展,就能模拟出这题了。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
typedef unsigned long long ull;
#define fi first
#define se second
#define mp make_pair
#define pb push_back
const int maxn=1000+5;
const int inf=0x3f3f3f3f;
const int mod=1e9+7;
int n,m,p;
int s[10];
char ma[maxn][maxn];
int ans[10];
int dx[4]={1,-1,0,0};
int dy[4]={0,0,1,-1};
bool vis[maxn][maxn];
int self[maxn][maxn][10];
queue<pii> que[10];
int main(){
scanf("%d%d%d",&n,&m,&p);
for(int i=1;i<=p;i++)scanf("%d",&s[i]);
memset(self,-1,sizeof(self));
for(int i=0;i<n;i++){
scanf("%s",ma[i]);
for(int j=0;j<m;j++){
if(ma[i][j]=='.'||ma[i][j]=='#')continue;
int id=ma[i][j]-'0';
vis[i][j]=1;
self[i][j][id]=0;
ans[id]++;
que[id].push(mp(i,j));
}
}
int turn=0;
while(1){
turn++;
bool f=0;