jzoj4824 配對遊戲 搜尋

2021-07-24 11:31:19 字數 1660 閱讀 7690

流行的跳棋遊戲是在乙個有m*n個方格的長方形棋盤上玩的。棋盤起初全部被動物或障礙物佔滿了。在乙個方格中,『x』表示乙個障礙物,乙個『0』~『9』的個位數字表示乙個不同種類的動物,相同的個位數字表示相同種類的動物。一對動物只有當它們屬於同一種類時才可以被消去。消去之後,他們所佔的方格就成為空方格,直到遊戲結束。要消去一對動物的前提條件是:這對候選動物所在的方格必須相鄰,或它們之間存在一條通路。棋盤上乙個方格只和其上下左右的方格相鄰。一條通路是由一串相鄰的空方格組成。路的長度則是通路中空方格的數目。你要輸出可被消去的動物的最多對數,以及在此操作過程中,最小的通路長度總和。直接搜尋,列舉刪除一對可行的點,隨便加點剪枝就可以了。

#include

#include

#include

#include

#include

#include

#define ll long long

#define max(a,b) ((a>b)?a:b)

#define min(a,b) ((a>b)?b:a)

#define fo(i,j,k) for(int i=j;i<=k;i++)

#define fd(i,j,k) for(int i=j;i>=k;i--)

using namespace std;

int const inf=2147483647;

int const maxn=10000;

int n,m,ans1,ans2,cntt,q1[30][30],q2[30][30],cnt[30],dis[30][30],in[30][30][30],use[30][30],w[4][2]=,,,};

char map[100][100];

void dfs(int x,int y)

else if((x==ans1)&&(yint head=0,tail=0,lim=inf;

fo(i,1,m)

fo(j,1,n)

if((!use[i][j])&&(cnt[map[i][j]]>1))

}else if((dis[x][head]+1<=lim)&&((i!=q1[x][head]+w[k][0])||(j!=q2[x][head]+w[k][1]))&&(map[q1[x][head]+w[k][0]][q2[x][head]+w[k][1]]==map[i][j]))}}

if(lim==inf)return;

fo(i,1,m)

fo(j,1,n)

if((!use[i][j])&&(cnt[map[i][j]]>1))

}else if((dis[x][head]+1<=lim+2)&&((i!=q1[x][head]+w[k][0])||(j!=q2[x][head]+w[k][1]))&&(map[q1[x][head]+w[k][0]][q2[x][head]+w[k][1]]==map[i][j]))}}

}int main()else map[i][j]=10;

}scanf("\n");

}fo(i,0,m+1)map[i][0]=map[i][n+1]=10;

fo(j,0,n+1)map[0][j]=map[m+1][j]=10;

dfs(0,0);

printf("%d %d",ans1,ans2);

return 0;

}

JZOJ4824 配對遊戲

流行的跳棋遊戲是在乙個有m n個方格的長方形棋盤上玩的。棋盤起初全部被動物或障礙物佔滿了。在乙個方格中,x 表示乙個障礙物,乙個 0 9 的個位數字表示乙個不同種類的動物,相同的個位數字表示相同種類的動物。一對動物只有當它們屬於同一種類時才可以被消去。消去之後,他們所佔的方格就成為空方格,直到遊戲結...

JZOJ4376 染色配對

就是給一些極大團包含點的關係,使最少的極大團包含點數為奇數。這裡題目說明每個點只與兩個極大團有被包含關係,所以我們把極大團看成點,點看成邊,則每個點連出去所有的邊 它們所對應的點 都與這個大點 所對應的極大團 有被包含關係。於是我們搜尋每個連通塊,對於每個連通塊我們建一顆搜尋樹 如下圖,黑色邊代表搜...

jzoj 3420 最優配對問題

平面上有n個點p1,p2,pn,你的任務是把它們配成n 2對 n是偶數 使得每個點恰好在乙個點對中。所有點對中兩點的距離之和應盡量小。n 20,xi yi 10000。第一行輸入n 2到20之間的偶數 接下來n行,每行輸入兩個整數表示xi,yi。xi yi 10000。輸出最小配對距離。答案保留兩位...