거리 측정 함수 새로 작성

- 이용하는 함수도 수정
This commit is contained in:
2018-04-02 01:50:51 +09:00
parent c0e2ed7013
commit 86ecf37da6
9 changed files with 171 additions and 184 deletions
+52 -80
View File
@@ -236,95 +236,67 @@ function SetNationFront($nationNo) {
}
function checkSupply($connect) {
include_once("queue.php");
$db = DB::db();
$query = "select city,nation,path from city";
$result = MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$cityNum = MYDB_num_rows($result);
for($i=0; $i < $cityNum; $i++) {
$city = MYDB_fetch_array($result);
$cityPath[$city['city']] = $city['path'];
$cityNation[$city['city']] = $city['nation'];
$label[$city['city']] = 0;
$cities = [];
foreach($db->query('SELECT city, nation FROM city WHERE nation != 0') as $city){
$cities[$city['city']] = [
'id'=>$city['city'],
'nation'=>$city['nation'],
'supply'=>false
];
}
$select = 0;
$queue = new Queue(20);
$queue2 = new Queue(20);
$labelling = 0;
$marked = 0;
$comCount = array();
//모든 도시 마크할 때까지
while($marked < $cityNum) {
$queue->clear(); $queue2->clear();
$q = $queue; $q2 = $queue2;
$labelling++;
//마크 되지 않은 도시부터 라벨링 시작
for($i=1; $i <= $cityNum; $i++) {
if($label[$i] == 0) {
$label[$i] = $labelling;
$labelMapping[$labelling] = $cityNation[$i];
isset($comCount[$cityNation[$i]]) ? $comCount[$cityNation[$i]]++ : $comCount[$cityNation[$i]] = 1;
$q->push($i);
$marked++;
break;
}
}
while($q->getSize() > 0 || $q2->getSize() > 0) {
while($q->getSize() > 0) {
$city = $q->pop();
unset($path);
$path = explode("|", $cityPath[$city]);
for($i=0; $i < count($path); $i++) {
if($label[$path[$i]] == 0 && $cityNation[$path[$i]] == $cityNation[$city]) {
$label[$path[$i]] = $labelling;
$q2->push($path[$i]);
$marked++;
}
}
}
if($select == 0) {
$q2 = $queue;
$q = $queue2;
} else {
$q = $queue;
$q2 = $queue2;
}
$select = 1 - $select;
}
}
//공백지는 다 보급상태
$query = "update city set supply='1' where nation='0'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
//우선 다 미보급 상태로
$query = "update city set supply='0' where nation!='0'";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
//도시 있는 국가들
$str = "city='0'";
//TODO: in 을 쓰는게 낫다
$queue = new \SplQueue();
foreach(getAllNationStaticInfo() as $nation){
if($nation['level'] <= 0){
continue;
}
$queue->enqueue($cities[$nation['capital']]);
}
$lbl = $label[$nation['capital']];
while(!$queue->isEmpty()){
$city = $queue->dequeue();
for ($k=1; $k <= $cityNum; $k++) {
if ($lbl == $label[$k]) {
$str .= " or city='{$k}'";
$city['supply'] = true;
foreach(array_keys(CityConst::byID($city['id'])->path) as $connCityID){
$connCity = $cities[$connCityID];
if($connCity['nation'] != $city['nation']){
continue;
}
if($connCity['supply']){
continue;
}
$queue->enqueue($connCity);
}
}
$query = "update city set supply='1' where {$str}";
MYDB_query($query, $connect) or Error(__LINE__.MYDB_error($connect),"");
$db->update('city',[
'supply'=>1
], 'nation=0');
$supply = [];
$unsupply = [];
foreach($cities as $city){
if($city['supply']){
$supply[] = $city['id'];
}
else{
$unsupply[] = $city['id'];
}
}
if($supply){
$db->update('city', [
'supply'=>1
], 'city IN %li', $supply);
}
if($unsupply){
$db->update('city', [
'supply'=>0
], 'city IN %li', $unsupply);
}
}