kavishrox's blog

By kavishrox, 10 years ago, In English

I made the following code for the problem http://www.spoj.com/problems/HIKE/ but its showing Wrong Answer and I am not able to find the case for which its going wrong . It would be very helpful if someone gives the case for my solution goes wrong.

#include<iostream>
#include<cstdio>
#include<vector>
#include<utility>
#include<string>
#include<cstring>
#include<cstdlib>
#include<climits>
#include<queue>

using namespace std;

vector<vector<char> > v;
int dp[51][51][51];
queue<int> q;
int n;
void bfs(int a,int b,int c){
	a--,b--,c--;
	q.push(a);
	q.push(b);
	q.push(c);
	dp[a][b][c]=0;
	//cout<<dp[a][b][c]<<endl;
	while(!(q.empty())){
		int x=q.front();
		q.pop();
		int y=q.front();
		q.pop();
		int z=q.front();
		q.pop();
		for(int i=0;i<n;i++){
			if(v[x][i]==v[y][z] and dp[i][y][z]>dp[x][y][z]+1){
				q.push(i);
				q.push(y);
				q.push(z);
				dp[i][y][z]=dp[x][y][z]+1;
			}
			else if(v[y][i]==v[x][z] and dp[x][i][z]>dp[x][y][z]+1){
				q.push(x);
				q.push(i);
				q.push(z);
				dp[x][i][z]=dp[x][y][z]+1;
			}
			else if(v[z][i]==v[x][y] and dp[x][y][i]>dp[x][y][z]+1){
				q.push(x);
				q.push(y);
				q.push(i);
				dp[x][y][i]=dp[x][y][z]+1;
			}
		}
	}
}
int main(){
	
	while(cin>>n and n){
		v.resize(n);
		for(int i=0;i<n;i++){
			v[i].resize(n);
		}
		for(int i=0;i<n;i++){
			for(int j=0;j<n;j++){
				for(int k=0;k<n;k++){
					dp[i][j][k]=INT_MAX-10;
				}
			}
		}
		int a,b,c;
		cin>>a>>b>>c;
		for(int i=0;i<n;i++){
			for(int j=0;j<n;j++){	
				cin>>v[i][j];
			}
		}
		/*for(int i=0;i<n;i++){
			cout<<endl;
			for(int j=0;j<n;j++){
				cout<<v[i][j]<<" ";
			}
		}*/
		bfs(a,b,c);
		int sol=INT_MAX-10;
		for(int i=0;i<n;i++){
			//cout<<dp[i][i][i]<<endl;
			if(dp[i][i][i] < sol)
				sol=dp[i][i][i];
		}
		if(sol==INT_MAX-10)
			cout<<"impossible"<<endl;
		else
			cout<<sol<<endl;
	}
	return 0;
}
  • Vote: I like it
  • 0
  • Vote: I do not like it

»
10 years ago, # |
  Vote: I like it -19 Vote: I do not like it

wtf? while(cin>>n and n)

while (cin >> n) {
   if (!n) break;
}
  • »
    »
    10 years ago, # ^ |
      Vote: I like it 0 Vote: I do not like it

    I don't think there's any problem with cin>>n and n but yes I will try to incorporate what you said in my answers.

    • »
      »
      »
      10 years ago, # ^ |
      Rev. 3   Vote: I like it -19 Vote: I do not like it

      you are wrong.
      1. what is "and" ?
      2. operator >> in std::basic_istream<_Elem,_Traits> returns std::basic_istream<_Elem,_Traits>& and std::basic_istream<_Elem,_Traits> has operator void*
      what is voidPtrVar and intVar?
      voidPtrVar && (void*)intVar ?
      voidPtrVar & (void*)intVar ?
      (int)voidPtrVar && intVar ?
      (int)voidPtrVar & intVar ?

      • »
        »
        »
        »
        10 years ago, # ^ |
          Vote: I like it 0 Vote: I do not like it

        and is equivalent to && in GNU C++ as said below by bayleef and as far as I know about the correctness of cin>>n thing, an if statement needs either a boolean, an integer, or a pointer as the quantity to be tested. The result of std::cin >> x is a reference to an istream, which is none of the above. However, the class istream does have that operator void* conversion operator which can be used to transform the istream reference to a pointer. It is this conversion operator that the language uses for the if test. Since failure to read marks the stream as invalid, the if test will fail if the read didn't work.

  • »
    »
    10 years ago, # ^ |
      Vote: I like it 0 Vote: I do not like it

    And what's the problem with "and"? In GNU C++ it's equivalent of &&.