hud 1846 Bash-Spiel (einfache Lösung oder Sprague-Grundy-Lösung)

Was ist das erste Spiel, zu dem Sie mutig genug sind? Es ist ganz einfach, es ist wie folgt definiert:
1. Dieses Spiel ist ein Spiel für zwei Personen;
2. Es gibt n Steine ​​auf einem Stapel;
3. Zwei Personen wechseln sich ab;
4. Jeder Schritt kann 1... wegnehmen. m Steine;
5. Die Seite, die zuerst alle Steine ​​nimmt, gewinnt;

Wenn beide Spieler im Spiel die optimale Strategie anwenden, geben Sie bitte aus, wer gewinnen kann.

Eingabe
Die Eingabedaten enthalten zunächst eine positive ganze Zahl C (C<=100), was darauf hinweist, dass es C Sätze von Testdaten gibt.
Jeder Testdatensatz belegt eine Zeile und enthält zwei Ganzzahlen n und m (1<=n, m<=1000). Die Bedeutung von n und m wird im Titel beschrieben.

Ausgabe
Wenn die Person, die zuerst geht, gewinnt, geben Sie bitte „Erster“ aus, andernfalls geben Sie bitte „Zweiter“ aus, und die Ausgabe jeder Instanz belegt eine Zeile.

Beispieleingabe
2
23 2
4 3
Ideen:

1. Wenn n <= m ist, kann der erste Spieler direkt den ersten Spieler nehmen, um zu gewinnen.

2. Wenn n = m+1, muss der erste Spieler verlieren.

using namespace std;

int main()
{
    int T,n,m;
    cin>>T;
    while(T--){
        cin>>n>>m;  
        if(n %(m-1) == 0) printf("second\n");
        else  printf("first\n");
    }
}

Lösung mit Graphenspiel und Sprague-Grundy-Funktion:

Die Regel des Graphenspiels besteht darin, einen gerichteten azyklischen Graphen festzulegen, eine Schachfigur auf einen Startpunkt zu legen und zwei Spieler abwechselnd die Schachfigur entlang der gerichteten Kante zu bewegen. Der Spieler, der sich nicht bewegen kann, wird als Verlierer gewertet.

   x stellt die Anzahl der Steine ​​dar. Wenn die Anzahl der Steine ​​0 ist, ist die erste Hand ein Zustand der Niederlage (die erste Hand bezieht sich auf die Person, die gerade den Stein nimmt), und das Hin und Her ist rekursiv.

#define _CRT_SECURE_NO_WARNINGS 1	
#include<iostream>
using namespace std;
const int MAX = 1001;
int n, m, sg[MAX], s[MAX];
void getSG() {
	memset(sg, 0, sizeof(sg));
	for (int i = 1; i <= n; i++) {
		memset(s, 0, sizeof(s));
		for (int j = 1; j <= m && i - j >= 0; j++) {
			s[sg[i - j]] = 1;
		}
		for (int j = 0; j <= n; j++) {
			if (!s[j]) {
				sg[i] = j;
				break;
			}
		}
	}
}
int main() {
	int c;
	cin >> c;
	while (c--) {
		cin >> n >> m;
		getSG();
		if (sg[n]) cout << "first" << endl;
		else cout << "second" << endl;
	}
	return 0;
}

Ich denke du magst

Origin blog.csdn.net/zhi6fui/article/details/128706050
Empfohlen
Rangfolge