Interactive Problems are those problems in which our solution or code interacts with the judge in real time. When we develop a solution for an Interactive Problem then the input data given to our solution may not be predetermined but is built for that problem specifically. The solution performs a series of exchange of data with the judge and at the end of the conversation the judge decides whether our solution was correct or not.
Â
Guessing the Number (An Interactive Problem)
In this problem the user has to guess the number during a communication with the judge. The user is provided with the upper and lower bound and he/she can ask the judge whether a number is the number to be guessed. The judge replies with -1 if the number is smaller than the number to be guessed or 1 if number is greater than the number to be guessed or 0 if it is equal to the number to be guessed.
Â
Approach 1 : Linear GuessingÂ
Â
The user can query the judge for all the numbers between lower limit and upper limit to find the solution.Â
Â

Â
#include <bits/stdc++.h>
using namespace std;
int main()
{
int lower_bound = 2;
int upper_bound = 10;
// Number to be guessed is 6
// Iterating from lower_bound to upper_bound
for (int i = lower_bound; i <= upper_bound; i++) {
cout << i << endl;
// Input the response from the judge
int response;
cin >> response;
if (response == 0) {
cout << "Number guessed is :" << i;
break;
}
}
return 0;
}
// This code is contributed by divyeshrabadiya07
import java.util.*;
class GFG {
public static void main(String[] args)
{
Scanner sc1 = new Scanner(System.in);
int lower_bound = 2;
int upper_bound = 10;
// Number to be guessed is 6
// Iterating from lower_bound to upper_bound
for (int i = lower_bound; i <= upper_bound; i++) {
System.out.println(i);
// Input the response from the judge
int response = sc1.nextInt();
if (response == 0) {
System.out.println("Number guessed is :" + i);
break;
}
}
}
}
if __name__=='__main__':
lower_bound = 2;
upper_bound = 10;
# Number to be guessed is 6
# Iterating from lower_bound to upper_bound
for i in range(lower_bound, upper_bound + 1):
print(i)
# Input the response from the judge
response = int(input())
if (response == 0):
print("Number guessed is :", i, end = '')
break;
# This code is contributed by rutvik_56
using System;
class GFG
{
public static void Main(string[] args)
{
int lower_bound = 2;
int upper_bound = 10;
// Number to be guessed is 6
// Iterating from lower_bound to upper_bound
for (int i = lower_bound; i <= upper_bound; i++)
{
Console.WriteLine(i);
// Input the response from the judge
int response = int.Parse(Console.ReadLine());
if (response == 0) {
Console.WriteLine("Number guessed is :" + i);
break;
}
}
}
}
// This code is contributed by Pratham76
// Setting the lower and upper bounds
let lowerBound = 2;
let upperBound = 10;
// Number to be guessed is 6
// Iterating from lowerBound to upperBound
for (let i = lowerBound; i <= upperBound; i++) {
console.log(i);
// Simulating input from the judge
// (For actual input, you can use prompt() in a browser environment)
let response = prompt("Enter 0 if the number is guessed correctly:");
// Converting the response to an integer
response = parseInt(response);
if (response === 0) {
console.log("Number guessed is: " + i);
break;
}
}
// This code is contributed by divyeshrabadiya07
Output
2 Number guessed is :2
Time Complexity: O(n)
Â
Approach 2 : Applying Binary SearchÂ
Â
We can also apply binary search interactively to find the solution. This solution is efficient as compared to the previous approach.
Â

Â
#include <bits/stdc++.h>
using namespace std;
int main(int argc, char** argv)
{
int lower_bound = 2;
int upper_bound = 10;
while (lower_bound <= upper_bound)
{
int mid = (lower_bound + upper_bound) / 2;
cout << mid << endl;
int response;
cin >> response;
if (response == -1)
lower_bound = mid + 1;
else if (response == 1)
upper_bound = mid - 1;
else if (response == 0){
cout << "Number guessed is :" + to_string(mid) << endl;
break;
}
}
return 0;
}
// This code is contributed by geeky01adarsh
import java.util.*;
class GFG {
public static void main(String[] args)
{
Scanner sc1 = new Scanner(System.in);
int lower_bound = 2;
int upper_bound = 10;
// Number to be guessed is 9
// Applying Binary Search interactively
while (lower_bound <= upper_bound) {
int mid = (lower_bound + upper_bound) / 2;
// Print the guessed number
System.out.println(mid);
// Input the response from the judge
int response = sc1.nextInt();
if (response == -1) {
lower_bound = mid + 1;
}
else if (response == 1) {
upper_bound = mid - 1;
}
else if (response == 0) {
System.out.println("Number guessed is :" + mid);
break;
}
}
}
}
lower_bound = 2
upper_bound = 10
# Number to be guessed is 9
# Applying Binary Search interactively
while (lower_bound <= upper_bound) :
mid = (lower_bound + upper_bound) // 2
# Print guessed number
print(mid)
# Input the response from the judge
response = int(input())
if (response == -1) :
lower_bound = mid + 1
elif (response == 1) :
upper_bound = mid - 1
elif (response == 0) :
print("Number guessed is :", mid)
break
using System;
class GFG {
static void Main() {
int lower_bound = 2;
int upper_bound = 10;
// Number to be guessed is 9
// Applying Binary Search interactively
while (lower_bound <= upper_bound) {
int mid = (lower_bound + upper_bound) / 2;
// Print the guessed number
Console.WriteLine(mid);
// Input the response from the judge
int response = Convert.ToInt32(Console.ReadLine());
if (response == -1) {
lower_bound = mid + 1;
}
else if (response == 1) {
upper_bound = mid - 1;
}
else if (response == 0) {
Console.WriteLine("Number guessed is :" + mid);
break;
}
}
}
}
// This code is contributed by divyesh072019
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
function binarySearch() {
let lowerBound = 2;
let upperBound = 10;
// Number to be guessed is 9
// Applying Binary Search interactively
while (lowerBound <= upperBound) {
let mid = Math.floor((lowerBound + upperBound) / 2);
// Print the guessed number
console.log(mid);
// Input the response from the judge
rl.question('Enter -1 if the number is lower, 1 if higher, or 0 if guessed correctly: ', (response) => {
response = parseInt(response);
if (response === -1) {
lowerBound = mid + 1;
} else if (response === 1) {
upperBound = mid - 1;
} else if (response === 0) {
console.log("Number guessed is: " + mid);
rl.close();
return;
}
binarySearch(); // Recursively call binarySearch function
});
return; // Exit the function after asking for user input
}
}
binarySearch(); // Start the binary search
Output
6 Number guessed is :6
Time Complexity: O(logn)Â
Algorithm Paradigm: Divide and Conquer
Â