int SolveSudoku() throws Exception{
		boolean p = true;
		while(p){
			p = Progress();
		}
		if(!Solved()){
			//save grid
			int[][] backupGrid = Copy(grid);
			int a = 0, b = 0;
			x:for(int i = 0; i < 9; i++){
				for(int j = 0; j < 9; j++){
					if(grid[i][j] == 0){
						a = i;
						b = j;
						break x;
					}
				}
			}
			int[] v = possibleValues(a,b);
			for(int i = 1; i <= 9; i++){
				if(v[i] > 0){
					continue;
				}
				//make a guess
				grid[a][b] = i;
				//System.out.println("Guessing " + i + " at (" + a + "," + b + ")");
				//PrintGrid();
				try{
					return SolveSudoku();
				} catch (Exception e) {
					//try next i
					grid = Copy(backupGrid);
				}
			}
			throw new Exception("No possible values");
		}
		
		System.out.println("Fixed");
		PrintGrid();
		return grid[0][0]*100 + grid[0][1]*10 + grid[0][2];
	}